Coding Test/JAVA 코딩테스트 풀이정리(프로그래머스)

프로그래머스 스쿨 Lv.1 - 모의고사
깝몬 2023. 12. 10. 14:43
class Solution {
    public int[] solution(int[] answers) {
        //정답의 개수를 담을 int 선언
        int count1 = 0;
        int count2 = 0;
        int count3 = 0;
        
        //정답을 주기대로 반복하는 배열 선언
        //1번과 3번은 10개씩, 2번은 8개씩 반복으로 처리한다.
        int[] answer1 = {1,2,3,4,5,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는 i를 복사하여 10으로 나눈 나머지를 사용한다.
        for(int i=0;i<answers.length;i++){
            int answerCheck = i;
            while(answerCheck>=10){
                answerCheck-=10;
            }
            if(answers[i]==answer1[answerCheck]){count1++;}   
            if(answers[i]==answer3[answerCheck]){count3++;}
        }
        for(int i=0;i<answers.length;i++){
            int answerCheck = i;
            while(answerCheck>=8){
                answerCheck-=8;
            }
            if(answers[i]==answer2[answerCheck]){count2++;}
        }
        //가장 큰 수를 찾고, 큰 수의 개수를 기록한다.
        int biggest = 0;
        int biggestCount = 0;
        if(biggest<count1){
            biggest=count1; biggestCount=1;
        }
        if(biggest<count2){
            biggest=count2; biggestCount=1;
        }else if(biggest==count2){
            biggestCount++;
        }
        if(biggest<count3){
            biggest=count3; biggestCount=1;
        }else if(biggest==count3){
            biggestCount++;
        }
        //큰수의 개수만큼 int배열을 만들어준다.
        int[] answer = new int[biggestCount];
        
        //가장 큰 수가 따로 등장하지 않았다면 모두 0개로 동점처리하기위해 1,2,3을 모두 담은 것을 미리 return
        if(biggest==0){return new int[]{1,2,3};}
        
        //해당하는 번호를 answer에 담아주며, 위치를 i++을 이용해 옮겨준다.
        int i=0;
        if(biggest==count1){answer[i]=1;i++;}
        if(biggest==count2){answer[i]=2;i++;}
        if(biggest==count3){answer[i]=3;i++;}
        
        return answer;
    }
}

 

탐색을 할때 논리를 만들어가는 과정이나, 조금 더 다듬어 깔끔한 풀이를 만들 수 있을 것 같다.

 

실력이 쌓이면 더 간결한 풀이로 답을 낼 수 있도록 도전해 봐야겠다.

 

 

 

 

 

※런타임에러가 발생했다.

 

런타임에러는 주로 수의 범위가 말이 되지 않는 상황에서 발생하는 것으로 배웠다.

 

 

 

이번에는 

 

for(int i=0;i<answers.length;i++){
            int answerCheck = i;
            while(answerCheck>=10){
                answerCheck-=10;
            }
            if(answers[i]==answer1[answerCheck]){count1++;}   
            if(answers[i]==answer3[answerCheck]){count3++;}
        }

 

이 부분에서 answerCheck가 10보다 클때만 10을 빼도록 했더니 10이 answer1에 들어가게되어 index범위인 0~9를 벗어나 이런 일이 발생한 것으로 보인다.

 

논리를 너무 길게정해서 발생한것보다는 index 범위를 벗어난것이 주된 원인이니 다음엔 빠르게 원인을 찾는 연습을 해야겠다.