Algorithm/Programmers

[프로그래머스] 모의고사 - Java

ikjo 2022. 1. 19. 16:47

문제 설명

 

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

 

풀이 : Success

소스 코드

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] s = new int[3];
        int[] s1 = {1,2,3,4,5};
        int[] s2 = {2,1,2,3,2,4,2,5};
        int[] s3 = {3,3,1,1,2,2,4,4,5,5};

        for (int i = 0; i < answers.length; i++) {
            if(answers[i] == s1[i%5]){
                s[0]++;
            }
            if(answers[i] == s2[i%8]){
                s[1]++;
            }
            if(answers[i] == s3[i%10]){
                s[2]++;
            }
        }
        
        int max = Arrays.stream(s).max().getAsInt();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < s.length; i++) {
            if(s[i] == max){
                list.add(i+1);
            }
        }

        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

풀이 회고

1번 수포자는  1, 2, 3, 4, 5 총 5개의 숫자를 반복해서 찍으며, 2번 수포자는 2, 1, 2, 3, 2, 4, 2, 5 총 8개의 숫자를 반복해서 찍으며, 3번 수포자는 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 총 10개의 숫자를 반복해서 찍는다. 이러한 규칙성을 활용하기 위해 각각의 수포자별로 한 주기의 숫자를 담은 정수형 배열(s1~s3)을 선언해주었다.

 

입력받는 매개변수 정수형 배열 answers에는 문제의 정답이 담겨있는데, 이를 순회하여 수포자별로 정답을 맞춘 개수를 카운팅시켰다. 카운팅시킨 값은 1번~3번 수포자 순으로 정수형 배열 s 인덱스 0~2에 각각 저장시켰다.

 

문제에서 요구하는 것은 가장 문제를 많이 맞힌 수포자를 찾는 것이므로 stream을 활용하여 정수형 배열 s에서 가장 큰 값을 얻어왔다. 이때 가장 문제를 많이 맞힌 수포자가 여러명일 수도 있으므로 별도 ArrayList 자료구조에 가장 큰 값을 가지고 있는 수포자 Number(1~3)를 순차적으로 add 시켜주었다. 최종 결과값의 타입은 정수형 배열이므로 다시 stream을 활용하여 정수형(int) 배열로 변환시켜주었다.

 

 

참고자료

  • https://programmers.co.kr/learn/courses/30/lessons/42840