이것도 전 문제인 최소직사각형과 마찬가지로 bfs알고리즘을 사용하지 않는 1레벨 완전탐색 문제였다.
모듈러 연산자를 사용하는 핵심 알고리즘은 바로 떠올릴 수 있었지만, 출력조건인 "가장 높은 점수를 받은 사람이 여럿일 경우 오름차순하여 return' 부분을 떠올리기 어려웠다.
3명 밖에 안되므로 억지로 짜려면 짤 순 있었지만, 다른 풀이를 참고하기로 했다.
풀이
1. 문제 정답 배열에 수포자의 반복되는 정답배열을 순서대로 비교하고, 수포자의 정답배열크기를 넘어가는 시점부터 모듈러연산자를 이용해 계속해서 비교해준다.
2. 먼저 3명 중 최댓값을 구하고, 그 최댓값과 같은 값을 가진 수포자를 순서대로 answer[]에 넣어 return한다.import java.util.*; class Solution { public int[] solution(int[] answers) { Queue<Integer> q = new LinkedList(); //answers가 주어짐 //1번 대입하여 맞은수 체크 //2번 대입하여 맞은수 체크 //3번 대입하여 맞은수 체크 //젤 많이맞은사람 return, 여러명이면 오름차순으로 같이 return int p1a = 0; int p2a = 0; int p3a = 0; int[] p1 = {1,2,3,4,5}; int[] p2 = {2,1,2,3,2,4,2,5}; int[] p3 = {3,3,1,1,2,2,4,4,5,5}; //p1 for(int i = 0; i < answers.length; i++){ int ans = p1[i%p1.length]; if(answers[i] == ans){ p1a++; } } //p2 for(int i = 0; i < answers.length; i++){ int ans = p2[i%p2.length]; if(answers[i] == ans){ p2a++; } } //p3 for(int i = 0; i < answers.length; i++){ int ans = p3[i%p3.length]; if(answers[i] == ans){ p3a++; } } //최댓값구하고, 그거랑 같은 애 출력 int max = Math.max(p1a, Math.max(p2a, p3a)); if(p1a == max) { q.add(1); } if(p2a == max) { q.add(2); } if(p3a == max) { q.add(3); } int[] answer = new int[q.size()]; int i = 0; while(!q.isEmpty()){ answer[i++] = q.poll(); } return answer; } }실수
1. 최댓값과 같은 수포자를 Queue에 추가할 때 굳이 for(i<3)문에 넣어서 3번 반복하게 만든 실수
2. while(isEmpty()) answer[i++] = ? 에서 answer[i]로 쓴 실수
3. i%n.length를 i%5로 쓴 실수