[알고리즘] 모의고사

노승철 ·2021년 2월 11일
0

알고리즘

목록 보기
4/10
post-thumbnail

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

작성 코드

const solution = (answers) => {
    const losers = [
        [1, 2, 3, 4, 5],
        [2, 1, 2, 3, 2, 4, 2, 5],
        [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    ];
    const maxNumbers = []; /* 루저들의(수포자) 문제 맞힌 수*/
    
    /* 맞힌 문제 카운트하기 */
    for(const loser of losers) {
        maxNumbers.push(answers.reduce((acc, cur, idx) => {
            cur === loser[idx % loser.length] ? acc++ : acc;
            return acc;
        }, 0));
    }       
        
    /* 제일 많이 맞힌 루저 찾기 */            
    const result = maxNumbers.reduce((acc, cur, idx) => {           
        cur === Math.max(...maxNumbers) ? acc.push(idx+1) : acc; 
        return acc;
    }, []); 
    
    return result;
}

정리
reduce(accumulator, currentValue, index, array)

accumulator - 배열의 누적 값
currentValue - 현재 값
index - 현재 배열의 인덱스
array - 배열 원본

reduce는 두 번째로 인자로 현재 인덱스에 해당하는 객체를 반환해주기 때문에 정답들의 순서대로 반환되는 수포자들의 값들과 비교하여 accumulator에 카운트하게 했다.

loser[idx % loser.length] ..?
수포자1의 길이가 5이고 정답 리스트의 인덱스를 0이라고 해보자 그러면 나머지로 0이 나온다. 0 % 5 = 0 이니까..
그럼 정답의 개수가 20개일 경우 20번 반복인데.. 수포자1의 길이는 고정이니까
0~19 % 5 = 0~4..

수포자1의 객체가 [1,2,3,4,5] 이므로
1,2,3,4,5를 총 4번 반복해서 정답과 비교할거임

이걸 하고 나면 가장 많이 맞힌 수포자를 구하는건 쉽다.
카운트된 수포자들을 reduce 함수로 가장 많이 맞힌 수포자를 찾고
첫 번째 파라미터를 list타입으로 현재 수포자의 index + 1해서 return만 해주면 끝.

일하면서 reduce 써보려 해도 어렵고 귀찮아서 안 쓸려했는데 이렇게 쓸줄은 몰랐다,, filter 안 쓰고 reduce로 다 커버 가능할 듯 싶다 ㅎㅎ 개꿀띵🤪

profile
👨🏻‍💻 #developer#일상#공부#기록

0개의 댓글

관련 채용 정보