반응형
- 첫 풀이
이 문제는 처음 풀 때 문제에 대한 이해가 부족했었다. 문제에서의 조건은 '1번부터 마지막 문제까지의 정답이 들은 배열 answers'이라 했지만, 필자는 수포자들이 찍은 문제의 수만큼 정답이 반복한다고 생각했다.(왜 그랬는지 모르겠다.) 예를 들어, 1번 수포자는 1,2,3,4,5,1,2,3,4,5 순으로 문제를 찍을 때, answers의 배열인 1,2,3,4,5가 1번 수포자가 찍은 문제를 반복해서 순회한다고 생각했다.
- 정답 풀이
그러나 위와 반대로 주어지는 정답 배열에 규칙성있게 찍는 수포자들의 번호가 몇 개가 일치하는지를 알아내면 되는 것이었다. 즉, 문제의 수가 10개인 정답 배열이 주어진다면, 수포자들은 10번까지 규칙성 있게 문제를 찍는 것이다.
import java.util.ArrayList;
class Solution {
public ArrayList<Integer> solution(int[] answers) {
// 1. 수포자들의 규칙성있는 찍기.
int[][] people = {{1,2,3,4,5},{ 2, 1, 2, 3, 2, 4, 2, 5},{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
// 2. 수포자들의 정답 수를 저장할 배열.
int[] collect = new int[3];
// 3. 제일 많이 맞힌 사람을 담아 반환할 ArrayList.
ArrayList<Integer> answer = new ArrayList<>();
int max = Integer.MIN_VALUE;
// 4. 수포자들 수 만큼 반복.
for(int i =0;i<3;i++){
// 4-1. 각 수포자들의 정답 수를 저장할 변수.
int cnt = 0;
// 4-2. 규칙성있는 찍기를 탐색하기 위한 인덱스.
int idx = 0;
// 4-3. 1번부터 마지막 문제까지의 정답을 탐색.
for(int j=0;j<answers.length;j++){
// 4-4. 정답 배열의 크기 > 위에서 저장한 규칙성있는 배열의 크기인 경우, 다시 0번 인덱스부터 탐색.
if(idx == people[i].length) idx = 0;
// 4-5. 정답인 경우 cnt 증가.
if( answers[j] == people[i][idx]){
cnt++;
}
// 4-6. 다음 찍은 문제 탐색을 위해 idx 증가.
idx++;
}
// 5. 가장 많이 맞힌 문제의 수를 저장.
if(cnt > max) max = cnt;
// 6. 각각의 수포자들이 맞힌 문제를 저장.
collect[i] = cnt;
}
// 7. 세 명의 수포자들이 맞힌 수 중 최대값인 경우는 ArrayList에 삽입.
for(int i =0;i<3;i++){
if(collect[i] == max) answer.add(i+1);
}
return answer;
}
}
반응형