https://school.programmers.co.kr/learn/courses/30/lessons/42840

먼저 수포자 1, 2, 3번의 반복되는 패턴을 파악하여 아래와 같이 배열에 저장해 두어야 한다.
int[][] pattern = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
그 다음에 정답지에 적힌 번호 answers와 각각 pattern[0](수포자1), pattern[1](수포자2), pattern[2](수포자3)에 작성한 번호와 같은지 하나씩 비교하며 score에 값을 증가시키면 된다.
이때 중요한 점이 주어진 answers 배열의 길이가 수포자1, 수포자2, 수포자3 보다 긴 경우 다시 반복되는 패턴의 시작부분과 비교해야 한다.
원형 큐의 원리를 이용하여 나머지셈 연산을 통해 처음부터 다시 돌아가야 한다는 점이다.
e.g. answers = {1, 2, 3, 4, 5, 6], 수포자1={1, 2, 3, 4, 5}인 경우
answers[5] = 6과 pattern[0][0] = 1이 같은지 비교해야 하는 상황이 오는 것이다.
따라서 아래와 같은 식이 성립한다.
이중 for문이 i, j 순서로 위에서 돌아간다고 가정
i는 answers 배열의 길이까지, j는 수포자의 수만큼 반복
if (answers[i] == pattern[j][i % pattern[j].length])
scores[j]++;
식으로 만드니 꽤 어려워 보이지만 아래와 같이 값을 직접 대입해보면 쉽게 이해할 수 있다.
i = 5
j = 0
5 % pattern[0].length == 5 % 5 == 0
i = 6
j = 0
6 % pattern[0].length == 6 % 5 == 1
...
i = 10
j = 0
10 % pattern[0].length == 10 % 5 == 0
이후에는 Arrays.stream(scores)를 통해 scores 배열을 스트림으로 만든 후, max() 메서드를 통해 최댓값을 구한다. 마지막으로 getAsInt() 메서드를 통해 int 자료형으로 반환한다.
반환한 값을 scores와 비교하여 같을 경우 최대 점수를 받았으므로 최종 리턴할 answer 배열에 추가하여 반환하면 된다.
따라서 전체 문제풀이 코드는 다음과 같다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
int[][] pattern = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] scores = new int[3];
for (int i = 0; i < answers.length; i++) {
// 2차원 배열에서 length는 row의 길이
for (int j = 0; j < pattern.length; j++) {
// 원형 큐를 구현하는 것과 동일한 원리로 나머지셈 연산 진행
if (answers[i] == pattern[j][i % pattern[j].length]) {
scores[j]++;
}
}
}
int maxScore = Arrays.stream(scores).max().getAsInt();
ArrayList<Integer> answer = new ArrayList<>();
for (int i = 0; i < scores.length; i++) {
if (scores[i] == maxScore) {
answer.add(i + 1);
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}