https://school.programmers.co.kr/learn/courses/30/lessons/42840
처음에는 answers의 length만큼 각 수포자의 정답 경우의 수를 구해서 풀려고 했다. 하지만 잘 생각해보니 반복은 %로 풀이 가능하다 라는걸 생각해냈다.
- 수포자별 반복 rule을 배열에 담아준다.
int[][] rules = {{1, 2, 3, 4, 5}, {2, 1, 2, 3, 2, 4, 2, 5}, {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
- answers의 정답을 각 수포자를 돌면서 확인한다.
for(int i = 0; i < answers.length; i++) { for(int j = 0; j < 3; j++) { if(answers[i] == getAnswer(i, j)) { count[j] += 1; if(max < count[j]) { max = count[j]; } } } }
- 각 수포자의 정답은 getAnswer메소드를 사용하여 구한다.
public static int getAnswer(int problem, int person) { int rule[] = rules[person]; return rule[problem % rule.length]; }
- 해당 부분은 list에 담아서 다시 배열로 전환하는 방법도 있지만, 여기서는 IntStream을 사용해서 전환해본다.
final int maxCount = max; int answer[] = IntStream.range(0, 3) .filter(i -> count[i] == maxCount) .map(i -> i+1) .toArray();
import java.util.*;
import java.util.stream.IntStream;
class Solution {
int[][] rules = {{1, 2, 3, 4, 5},
{ 2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
int[] count = new int[3];
public int[] solution(int[] answers) {
int max = 0;
for(int i = 0; i < answers.length; i++){
for(int j = 0; j < 3; j++){
if(answers[i] == getCount(i, j)){
count[j] += 1;
if(max < count[j]){
max = count[j];
}
}
}
}
final int maxCount = max;
int[] answer = IntStream.range(0, 3)
.filter(i -> count[i] == maxCount)
.map(i -> i+1)
.toArray();
return answer;
}
public int getCount(int problem, int person){
int rule[] = rules[person];
return rule[problem % rule.length];
}
}