수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
answers return [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
배열을 만들고 계산하는게 더 좋았다.
각 수포자가 몇개 맞추는지 구하는것 까진 동일하다.
그 후 가장 큰 값 즉, 가장 많이 맞춘 사람의 갯수를 구하고
수포자의 정답 갯수와 비교해서 똑같다면 배열에 담아줘서 리턴해준다.
항상 풀면서 느끼지만 문제를 더 꼼꼼히 읽어야겠다.