알고리즘

프로그래머스 Lv.1 모의고사 - JAVA

jaewoo 2023. 3. 24. 16:06

문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때,  가장 많은 문제를 맺힌 사람이 누구인지 배열에 담아 return 하도록 solution함수를 작성

 

 

풀이

- 여기서 1,2,3 번에 패턴이 정해져 있고 해당 패턴을 보면 12345(5)ㅡ21232425(8)-3311224455(10) 자리이다.

처음에 레벨 1이길래 간단하게 생각해서 풀었는데 21점으로 계속 틀렸다. 이유가 있었는데 바로 정답에 길이가 길 수도 있는 경우였다. 그러니까 주어지는 배열 answers가 12가 나오는데 for문이 12까지 돌려서 답을 맞추면 1번에 배열은 없는 값을 탐색하는 경우가 된다. 그래서 런타임에러... 그러기 때문에 해당 값을 나눈 나머지로 해줘야함 i%5 이런식으로 해주면 된다.

그리고 두번쨰로 이해가 되지 않았던게 출력된 값이다. 어떻게 1과 123이 나오는지 계속 생각해보다가 결국 최고 점수한 번호만 뽑으면 되는데 전부다 점수가 같으면 전부 다 뽑으면 된다.

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        
        int[] one = {1,2,3,4,5}; // 5개씩 반복
        int[] two = {2,1,2,3,2,4,2,5}; // 8개씩 반복
        int[] three = {3,3,1,1,2,2,4,4,5,5}; // 10개씩 반복
        
        List<Integer> list = new ArrayList<>();
        int num[] = {0,0,0};
        
        for(int i =0;i<answers.length;i++){
            if(one[i%5] == answers[i]) num[0]++;                
            if(two[i%8] == answers[i]) num[1]++;
            if(three[i%10] == answers[i]) num[2]++;
        }
        int max = Math.max(num[0],Math.max(num[1],num[2]));
        
        for(int i=0;i<num.length;i++){
            if(max == num[i]) list.add(i+1);
        }
        
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}