- 전체코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer = {};
int[] answer1 = {1,2,3,4,5};
int[] answer2 = {2,1,2,3,2,4,2,5};
int[] answer3 = {3,3,1,1,2,2,4,4,5,5};
int[] correctAnswer = new int[3];
int max = 0;
for(int i = 0 ; i < answers.length ; i++) {
if(answers[i] == answer1[i%answer1.length]) {
correctAnswer[0]++;
}
if(answers[i] == answer2[i%answer2.length]) {
correctAnswer[1]++;
}
if(answers[i] == answer3[i%answer3.length]) {
correctAnswer[2]++;
}
}
max = Math.max(Math.max(correctAnswer[0], correctAnswer[1]), correctAnswer[2]);
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i =0 ; i < correctAnswer.length ; i++) {
if(max == correctAnswer[i]) {
list.add(i+1);
}
}
answer = new int[list.size()];
for(int i =0; i<answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
}
- 전체코드 부분수정
// answer = new int[list.size()];
// for(int i =0; i<answer.length; i++) {
// answer[i] = list.get(i);
// }
answer = list.stream().mapToInt(x -> x).toArray();
- 막혔던점 & 해경방법 및 느낀점
- 처음 문제를 보고 모든 과정을 for문으로 만들었다. 하지만 같은 for문을 여러번 사용하는것이 코드가 길어지고 가독성을 떨어뜨린다고 생각하여 수정하였다. 최댓값을 구하는데 max()메소드를 사용하였으며, ArrayList를 사용하여 배열타입을 선언하는데 필요한 값을 구하는 for문을 줄였다.
- 코드를 간결화하는데 있어서 사용한 ArrayList를 return 타입에 맞게 배열로 바꾸어 주어야했다. 이 과정을 for문으로 해결할 수 있지만 다른 방법을 찾고싶어서 구글에서 찾던 도중 발견한 것이 Stream api였다. [발견한 글] 이를 통해 코드는 간결해졌으나, 테스트 결과 실행속도가 느려지는 단점이 존재했다. 코딩테스트 연습을 하며 다른 사람의 풀이 또한 보게되는데 자주 보이던 람다식의 문제점으로 보인다. [참고글] 하지만 람다식과 Stream api이 가지는 이점 또한 분명하기 때문에 이를 적재적소에 사용하는 개발자가 되어야겠다.