[코딩테스트연습] 모의고사

LaStella·2021년 10월 25일
0

- 전체코드

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();

- 막혔던점 & 해경방법 및 느낀점

  1. 처음 문제를 보고 모든 과정을 for문으로 만들었다. 하지만 같은 for문을 여러번 사용하는것이 코드가 길어지고 가독성을 떨어뜨린다고 생각하여 수정하였다. 최댓값을 구하는데 max()메소드를 사용하였으며, ArrayList를 사용하여 배열타입을 선언하는데 필요한 값을 구하는 for문을 줄였다.
  2. 코드를 간결화하는데 있어서 사용한 ArrayList를 return 타입에 맞게 배열로 바꾸어 주어야했다. 이 과정을 for문으로 해결할 수 있지만 다른 방법을 찾고싶어서 구글에서 찾던 도중 발견한 것이 Stream api였다. [발견한 글] 이를 통해 코드는 간결해졌으나, 테스트 결과 실행속도가 느려지는 단점이 존재했다. 코딩테스트 연습을 하며 다른 사람의 풀이 또한 보게되는데 자주 보이던 람다식의 문제점으로 보인다. [참고글] 하지만 람다식과 Stream api이 가지는 이점 또한 분명하기 때문에 이를 적재적소에 사용하는 개발자가 되어야겠다.
profile
개발자가 되어가는 중...

0개의 댓글