수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
입출력 예 #1
수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.
4번의 과정에서 많은 시간을 낭비했다!
우선 return 해야할 자료형이 int[]다.
그러나 문제 입출력 예제만 보아도 return 해야할 배열의 크기가 입력마다 달라진다.
C++에서는 vector로 max 값과 같으면 push해서 쉽게 끝났었는데 Java는 배열의 크기를 동적으로 다루기 위해서는 List를 선언해야한다.
이 List를 answer에 toArray()하는 과정에서 (Integer to int) 형변환 오류가 발생했다!
이를 최대한 스마트하게 (짧은 코드로) 해결하고싶은 욕심에 시간을 많이 쓰다가 결국 구글링을 통해 아주 좋은 코드를 발견할 수 있었다.
링크속의 코드를 그대로 사용하니 한번에 통과했다!
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
List<Integer> arr = new ArrayList(0);
int[] answer = {};
int[] man2 = {1,3,4,5};
int[] man3 = {3,1,2,4,5};
int[] res = new int[3];
for(int i = 0; i < answers.length; i++){
if(answers[i] == i % 5 + 1) res[0]++; // 1번
if(i % 2 == 0 && answers[i] == 2) res[1]++;
else if(i % 2 != 0 && answers[i] == man2[(i % 8) / 2]) res[1]++; // 2번
if(answers[i] == man3[(i % 10) / 2]) res[2]++; // 3번
}
int max = res[0] > res[1] ? res[0] > res[2] ? res[0] : res[2] : res[1] > res[2] ? res[1] : res[2];
for(int i = 0; i < res.length; i++){
if(res[i] == max) arr.add(i + 1);
}
answer = arr.stream().mapToInt(i->i).toArray();
return answer;
}
}