본문 바로가기
Algorithme/Programmers

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

by 케로베로 2020. 10. 17.

programmers.co.kr/learn/courses/30/lessons/42840

 

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

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

programmers.co.kr

 

문제 요약

 모의고사 정답 배열 answers를 받는다. 세 명의 학생이 각각 특정한 루프로 정답을 찍는다.

  • 1번 학생: [1, 2, 3, 4, 5] 반복
  • 2번 학생: [2, 1, 2, 3, 2, 4, 2, 5] 반복
  • 3번 학생: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] 반복

각 학생 중 최고 점수를 받은 학생들의 번호 배열을 반환한다.

 

 

문제 풀이

자바8의 streamAPI를 공부했었지만 아직 딱히 사용할 곳이 없어서 점점 잊어버리게 되는 걸 느끼고 앞으로는 최대한 자바8 문법을 사용해서 문제를 풀기로 하였다.

 

 이 문제는 완전탐색 문제이고 조금 귀찮은 것을 빼고는 난이도는 매우 낮은 문제이다. 일단 각 학생의 반복 패턴 리스트를 배열로 만든다. 그 다음 인자로 받은 answers 배열과 비교하며 학생의 점수 배열을 채운다.  채점할 때는 루프[(문제의 번호) % (루프의 길이)]를 정답과 비교하면 된다.

 

그 후 학생 점수 배열에서 최대값을 찾고, 최대값과 같은 점수의 학생들의 번호를 배열로 만들면 되는데, 외부 반복으로 처리할 시 '배열에서 최대값 찾기', '배열에서 최대값과 같은 학생 수 찾기', '배열에 학생번호 채우기' 총 3번 for 문을 돌려야 하는데, 스트림을 사용하여서 처리하였기 때문에 선언형으로 모두 한번에 처리할 수가 있었다.

 

나의 코드

 

import java.util.*;
import java.util.stream.IntStream;

class 모의고사 {
    public int[] solution(int[] answers) {
        int[] students = new int[3];    //  학생들의 점수 배열

        /* 학생별 반복 구간 List 배열 */
        List<Integer>[] roop = new List[3]; //  반복 구간 배열 선언
        for (int i = 0; i < 3; ++i)
            roop[i] = new ArrayList<>();
        roop[0] = Arrays.asList(1, 2, 3, 4, 5);
        roop[1] = Arrays.asList(2, 1, 2, 3, 2, 4, 2, 5);
        roop[2] = Arrays.asList(3, 3, 1, 1, 2, 2, 4, 4, 5, 5);

        /* 채점하기 */
        for (int i = 0; i < answers.length; ++i) {
            for (int j = 0; j < 3; ++j) {
                if (answers[i] == roop[j].get(i % roop[j].size()))
                    students[j]++;
            }
        }

        /* 최대 점수와 같은 점수의 학생 번호 배열 반환  */
        return IntStream.range(1, 4)
                .filter(i -> students[i - 1] == Arrays.stream(students).max().getAsInt())
                .toArray();
    }
}