공통된 문제 하나씩 풀어와서 서로 설명해주는 오프라인 스터디

문제 풀이

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

// 석우님의 풀이 - 1
const test = sizes.map(el => el[0] > el[1] ? el[0] : el[1]);
    const test2 = sizes.map(el => el[1] < el[0] ? el[1] : el[0]);
    console.log(test, test2);
    return Math.max(...test) * Math.max(...test2);

// 2
sizes.forEach(el => {
        el.sort((a, b) => b - a);
    })
    
    const 큰놈 = sizes.map(el => el[0])
    const 작은놈 = sizes.map(el => el[1])
    
    return Math.max(...큰놈) * Math.max(...작은놈);
// 도영님의 풀이
function solution(sizes) {
    let bestSize = [Math.max(...sizes.map(v => Math.min(...v))),
                    Math.max(...sizes.map(v => Math.max(...v)))]
    return bestSize[0] * bestSize[1];
}

 

 

공통된 문제 하나씩 풀어와서 서로 설명해주는 오프라인 스터디

문제 풀이 의식의 흐름

나머지가 1이 되게 하는 가장 작은 자연수를 찾는 문제

 

  1. n 값에서 1을 뺀다 (나머지가 1이기 때문에 역순으로 풀어봄)
  2. 그 값에서 최소 공배수를 구해 리턴한다

이렇게 생각했는데 그럴 필요도 없는 문제였다

 

const solution(n) {
  for (let i = 2; i < n; i++) {
    if (n % i === 1) return i;
  }
};

 

%를 사용하면 된다

제한사항으로 n 이 3부터 시작, 최소값은 2부터 가능하므로

for 문을 i를 2부터, i 는 n 보다 작고, 순회한다

만약 n 을 i로 나눈 나머지 값이 1과 같다면 그때 i 값을 출력한다

 

공통된 문제 하나씩 풀어와서 서로 설명해주는 오프라인 스터디

문제 풀이 의식의 흐름

배열에서 공통된 요소가 가장 많은 요소를 나타내야한다

각 요소의 갯수가 똑같을 시에는 -1을 리턴해야하는 약간 까다로운 문제

 

  1. 배열에서 각 요소의 갯수를 세주고
  2. 갯수들 중 최대값을 뽑아야한다
  3. 최대값이 같은 것이 2이상 나오면 -1을 리턴한다
  4. 그렇지 않다면, 최대값에 해당하는 요소를 나타낸다

생각은 했지만 구현은 어려워 풀지 못하고, 동료들의 풀이를 들어봤다

// 석우님 풀이
function solution(array) {
    let answer = 0;
    let 값 = new Set(array)
    let 종합 = {};
    for (const number of 값) {
        종합[number] = array.filter(element => element === number).length
    }
    let 개수 = Object.values(종합)
    answer = +Object.keys(종합).find(key => 종합[key] === Math.max(...개수))
    개수.indexOf(Math.max(...개수)) !== 개수.lastIndexOf(Math.max(...개수)) ? answer = -1 : 0

    return answer;
}
    // for (const number of 값) {
    //     let 개수 = array.filter(element => element === number).length
    //     개수 > answer ? answer = number : 0
    // }
// 도영님의 풀이
function solution(array) {
    let temp = {}
    let cnt = 0;
    
    for(i in array){
        temp[array[i]] = array.filter(v => v === array[i]).length
    }
    let maxCnt = Math.max(...Object.values(temp))
    for(i of Object.values(temp)){
        if(maxCnt === i){
            cnt++}
    }
    if(cnt > 1){
        return -1
    }else{
        return +Object.keys(temp)[Object.values(temp).indexOf(maxCnt)]
    }
}
// 성진님의 풀이 - 1
function solution(array) {
    var answer = [];

    let arr = new Set(array);
        arr = [...arr]
   // console.log(arr)
    for(let value of arr){     
        let num = 0;
        for(let i=0; i<array.length; i++){
            if(value === array[i]) num += 1
        }
        answer.push(num)
    }
    //  console.log(answer)
    
     let result = Math.max(...answer);
    // 만약 answer 배열에서 result값이 두개 이상이면 -1을 리턴
    // 아니라면 result값을 arr에서 찾아서 그 값을 리턴
   if(answer.filter(e => e === result).length >= 2) return -1
    else return arr[answer.indexOf(result)]
}

// 2
function solution(array) {

    let arr = new Map();
    
    for(let i of array){
        arr.set( i , (arr.get(i) || 0) +1)
    }
    
    let result = [...arr].sort((a,b) => b[0] - a[0]); // 원소 먼저 정렬
        result.sort((a,b) => b[1] - a[1]); // 최빈값 정렬
    
    if( result.length === 1) return result[0][0]
    else if( result[0][1] === result[1][1]) return -1
    else return result[0][0]
}

// 3 
function solution(array) {
    
    let copy = [...array]; // 삭제될 배열을 만들어줌
   
    let result = {};
    
    for(let i of array){
        result[i] = 0;
    }
    // console.log(result)
    // 위 코드는 각 요소의 초깃값을 설정

    for(let i of array){
        
        if(copy.includes(i)){
            copy.splice(copy.indexOf(i),1);
            result[i]++
        }
    }

    result = Object.entries(result);
    result.sort((a,b) => b[1] - a[1])
    return (result.length === 1 || result[0][1] > result[1][1]) ? parseInt(result[0][0]) : -1;
}

 

참고

  • 모던자바스크립트
    map set (새로운 배열을 만든다)
  • ... 스프레드 문법
    Object.values() 값만 뽑아내는 문법
  • length를 활용하자

문제풀이 의식의 흐름

n은 인분

k는 음료수 갯수

 

n 곱하기 12000원은 양꼬치 값

+

(음료수 갯수 빼기 서비스 음료수 갯수) 곱하기 2000원이 음료수 값

 

서비스는 10인분에 1개씩이므로 인분 나누기 10

소수점은 Math.floor로 내려준다

(parseInt 보다는 Math.floor 선호)

function solution(n, k) {
  return n * 12000 + (k - Math.floor(n / 10)) * 2000;
}

 

  • 내 풀이
//

문제풀이 의식의 흐름

평균을 구하려면 각 배열의 원소들을 합한뒤 배열의 길이로 나누면 된다
필요한건 배열의 총 합

//for문을 이용한 배열의 합
let 배열의합 = 0;
for (let i = 0; i < numbers.length; i++) {
    배열의합 += numbers[i];
}
//forEach를 이용한 배열의 합
let 배열의합 = 0;
numbers.forEach(function(item){
  배열의합 += item;
});

배열의 길이

numbers.length

배열의 총 합 / numbers.length

reduce를 이용한 방법

function solution(numbers) {
  const number = numbers.reduce((acc, cur) => acc + cur);
  return number / numbers.length;
}

reduce를 이용한 방법 화살표 함수

function solution(numbers) {
  return numbers.reduce((a, c) => a + c, 0) / numbers.length;
}

map을 사용하는 방법

function solution(numbers) {
    let sum = 0
    numbers.map((_, i) => sum += numbers[i])
    return (sum / numbers.length)
}
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이 의식의 흐름

문젠느 아주 간단하다

if, else if 쓰면 될 것 같은데?

const angle = i 라 하자,

만약에, 0 < i < 90 이면 1 (true)

그게 아니면 (false), i = 90 일 때 2 (true)

그게 아니면 (false), 90 < i <180 일 때 3 (true)

그게 아니면 (false), i = 180 일 때 4 (true)

 

거진 3시간 동안 삽질한 결과, 논리는 맞는거 같은데 자꾸 레퍼런스오류가 났다

다른 풀이들은 전부 변수를 angle 그대로 넣었더라;

알파벳 몇개 좀 안쓰려고 꼼수?부리다 되려 시간낭비만 했다

다음엔 고민하는 시간 리소스 분배에 신경써야겠다

  • 변수명을 따로 주지 않고 정정한 내 풀이
function solution(angle) {    
    if (angle < 90) {
        return 1;
    } else if(angle === 90) {
        return 2;
    } else if(angle <180) {
        return 3;
    } else {
        return 4;
    }
}
  • 더 좋아보이는 풀이 1.filter 활용
function solution(angle) {
    return [0, 90, 91, 180].filter(x => angle>=x).length;
}

한줄로 깔끔해보여서 가져왔는데, 가만보니 이해가 안가는 것이었다?!

각각 1,2,3,4 값을 리턴해야하는 문제인데 리턴값이 안 보이고, 왜 90 다음이 91인지? 모르겠더라

 

감사하게도, 알고리즘 스터디원 윤정님이 해석을 해주셨다

 

filter

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

 

Array.prototype.filter() - JavaScript | MDN

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

developer.mozilla.org

filter 는 함수를 만족하는 모든 요소들로 새로운 배열을 만들어 내는 메서드이다

.filter(x => angle>=x)


filter에 주어진 함수를 해석해보면

x (매개변수) 보다 angle (변수)가 크거나 같으면 새로운 배열로 걸러진다

 

return [0, 90, 91, 180].filter(x => angle>=x).length;

뒤에 .length가 붙으므로 새로운 배열의 길이를 나타내고 이 값이 곧 리턴값이 된다

 

예시로 90도 이하의 값인 30도가 변수, angle로 주어진다면?

앞의 배열에서부터 하나씩 x값으로 넣어보자

 

30 >=0 이므로 0은 새로운 배열의 요소가 된다

그러나 90, 91, 180은 성립하지 않는다

고로 생성된 배열의 길이는 [0], 1개가 된다

 

마찬가지로 angle 값을 90도인 직각이라면

새로운 배열은 [0,90]

배열의 길이는 2 가 된다

 

angle 값이 90도와 180도의 사이인 100도 라면?

새로운 배열은 [0,90,91]

배열의 길이는 3 가 된다

 

180도 라면?

새로운 배열은 [0,90,91,180]

배열의 길이는 4 가 된다

 

여기서, 잠깐!! 90과 91사이의 숫자가 변수로 온다면? 이를테면 90.5라면..??

이거 헛점이네~ 라고 생각한 순간 문제가 다시 보였다

응, 그렇구나!

  • 더 좋아보이는 풀이 2.삼항연산자 활용
function solution(angle) {
    return angle < 90 ? 1 : angle === 90 ? 2 : angle < 180 ? 3 : 4;
}

삼항연산자가 아직 익숙치 않아서 마치 다 한문장인 언어처럼 보이지만

angle < 90 ? true 일때 1
				false라면 다음 식으로
: angle === 90 ? true 일때 2
				false라면 다음 식으로
: angle < 180 ? true 일때 3
				false라면 다음 식으로
: 4;

뜯어보면 달리 설명할 필요도 없이 직관적이고 간결하다

if문으로 풀고 싶었는 데, 뭔가 문법이 안 맞는지 풀 수 없었다

풀이보고 혼자 다시 적어보았다

  • 내 풀이
const solution = (num1, num2) => (num1 == num2)? 1 : -1
  • 틀린부분은 정정한 원래 내 오답
function solution(num1, num2) {
    if (num1 == num2){
        return 1;
    }
    else{
        return -1;
    }
}

틀린원인은

  1. eles 오타가 있었고
  2. return = 1 이러고 있었다
  • 내 풀이
const solution = (num1,num2) => Math.floor(num1 / num2 * 1000)
  • 내 풀이
const solution = (age) => 2022 - age + 1

나머지 연산자는 %

  • 내 풀이
const solution = (num1,num2) => num1 % num2

+ Recent posts