우선 나는 int 배열의 최댓값을 구할때 Arrays.stream()을 이용했는데 Math.max를 이용할 수도 있을 듯 하다.
Java에서는 int 배열을 선언할 때 크기도 같이 결정해주어야하기 때문에, 최고점을 받은 사람이 1명인지, 2명인지 모르는 상태에서 반환될 배열을 만드는 것은 불가능하다고 생각했다. 그래서 나는 그냥 반환형을 int[]
에서 List<Integer>
으로 바꿔버렸다.
코테에서는 이렇게 풀면 오답으로 처리할 것 같다
다른 사람들의 풀이를 보니 크게 2가지 방법으로 내가 헤멘 문제를 해결할 수 있을듯하다.
List<Integer> list = new ArrayList<>();
#중략
int[] answer = new int[list.size()];
이렇게 Arraylist에 add한 채로 그의 size에 맞게 다시 int 배열을 생성하고, 값을 다시 대입해서 반환하는 방법이다. (파이썬이라면 안써줘도 될 코드를 자바는 써야한다... ㅂㄷㅂㄷ 🤢)
ArrayList<Integer> list = new ArrayList<>();
#중략
return list.stream().mapToInt(i->i.intValue()).toArray();
이렇게 stream().mapToInt().toArray()를 사용해도 ArrayList를 int 배열로 바꾸어 반환 가능하다.
위 두가지 방법을 모두 숙지해두고 다음 문제부터는 적용할 수 있도록 해야겠다.
import java.util.*;
class Solution {
public static List<Integer> solution(int[] answers) {
int[] answer = new int[3];
int[] person1 = {1, 2, 3, 4, 5};
int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
for (int i = 0; i < answers.length; i++) {
if (answers[i] == person1[i % 5]) {
answer[0] += 1;
}
if (answers[i] == person2[i % 8]) {
answer[1] += 1;
}
if (answers[i] == person3[i % 10]) {
answer[2] += 1;
}
}
int max = Arrays.stream(answer).max().getAsInt();
List<Integer> result = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (answer[i] == max) {
result.add(i+1);
}
}
return result;
}
}