[프로그래머스] 모의고사

butterbeetle·2023년 4월 17일
0

코딩테스트

목록 보기
107/132
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하는 값을 오름차순 정렬해주세요.

입출력 예

answersreturn
[1,2,3,4,5][1]
[1,3,2,4,2][1,2,3]

내 풀이

function solution(ans) {
    const result = [];
    const supo = [[1, 2, 3, 4, 5],
                  [2, 1, 2, 3, 2, 4, 2, 5],
                  [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    
    for(let i=0; i<3; i++){
        let cnt = 0;
        const len = supo[i].length
        
        ans.forEach((num,idx)=>{
            if(supo[i][idx%len] === num) cnt++;
        })
        if(cnt > 0) result.push([i+1,cnt])
    }
    
    return result.sort((a,b)=>b[1] - a[1]).map(arr=>arr[0]);
}

각 수포자들의 찍는 방식을 배열에 담아서 for문으로 반복시키면서
몇개 맞췄나를 구한뒤 1개 이상 맞추면 result에 담아 cnt를 기준으로 sort하는 방식인데 TC는 통과해도 역시 Test5 ~ 12,14번이 실패 했었다.

처음에는 문제 맞힌 사람을 오름차순으로 정렬하는 문제인줄 알았다..
그래서 나온 코드가 위 코드이다.

근데 문제를 다시 잘 읽어보니 가장 많은 문제를 맞힌 사람을 구하는 것 이였다.
배열에 담는다 해서 맞추사람 전부를 담는 줄 알았는데 아니였다..

function solution(ans) {
    const count = [0,0,0];
    const supo = [[1, 2, 3, 4, 5],
                  [2, 1, 2, 3, 2, 4, 2, 5],
                  [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    
    for(let i=0; i<3; i++){
        const len = supo[i].length    
        ans.forEach((num,idx)=>{
            if(supo[i][idx%len] === num) count[i]++;
        })
    }
    
    const max = Math.max(...count)
    
    return count.reduce((acc,cnt,idx)=>{
        if(cnt === max) acc.push(idx+1)
        return acc
    },[])
}

다시 생각해보니 어차피 1번 수포자부터 계산해서 오름차순으로 sort를 한번 더 할 필요는 없고
수포자 또한 3명으로 고정이니 count배열을 만들고 계산하는게 더 좋았다.

각 수포자가 몇개 맞추는지 구하는것 까진 동일하다.
그 후 가장 큰 값 즉, 가장 많이 맞춘 사람의 갯수를 구하고
수포자의 정답 갯수와 비교해서 똑같다면 배열에 담아줘서 리턴해준다.


항상 풀면서 느끼지만 문제를 더 꼼꼼히 읽어야겠다.

profile
멍청이

0개의 댓글