Language/JAVA

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

paran21 2022. 1. 20. 23:26

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int[] solution(int[] answers) {
        //수포자별로 배열을 만들기
        //찍는 방식을 배열로 생성
        int[] p1a = new int[]{1, 2, 3, 4, 5};
        int[] p2a = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
        int[] p3a = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int[] p1 = new int[answers.length];
        int[] p2 = new int[answers.length];
        int[] p3 = new int[answers.length];

        //%를 이용해서 answers 배열 수만큼 반복해서 배열 넣기
        for (int i = 0; i < answers.length; i++) {
            p1[i] = p1a[i%p1a.length];
            p2[i] = p2a[i%p2a.length];
            p3[i] = p3a[i%p3a.length];
        }

        //일치하는 횟수 카운트하기
        int k1 = 0, k2 = 0, k3 = 0;
        for (int i = 0; i < answers.length; i++) {
            if(p1[i] == (answers[i])) k1++;
            if(p2[i] == (answers[i])) k2++;
            if(p3[i] == (answers[i])) k3++;
        }

        //배열 위치 확인 위해 원래 배열 유지
        int[] groups = new int[]{k1, k2, k3};

        //복사본 배열 통해 최대값 확인
        int[] groupsSort = groups.clone();
        Arrays.sort(groupsSort);
        int max = groupsSort[2];

        //최대값보다 같거나 크면 group에 넣기
        //1, 2, 3번 순으로 확인해서 별도로 오름차순 안해도 됨.
        List<Integer> arr = new ArrayList<>();
        for (int i = 0; i < groups.length; i++) {
            if (groups[i] >= max) {
                arr.add(i+1);
            }
        }

        //답안제출을 위해 int[]로 변환
        //int[] answer = arr.stream().mapToInt(Integer::intValue).toArray();
                int[] answer = new int[arr.size()];
        int k = 0;
        for (int x : arr) {
            answer[k++] = x;
        }
        return answer;
    }
}

이 문제는 문제를 어떻게 풀지 틀은 금방 잡았는데, 각각을 구현하는게 쉽지 않았다.

 

1. 순서가 반복되는 배열 만들기

  • 수포자의 찍는 방식이 반복되는데 이걸 문제수(답안수)만큼 반복해야 했다.
  • 배열을 따로 만들고 %을 이용해서 반복하였다.

 

2. 가장 많이 맞춘 사람을 배열로 출력하기

  • 맞춘 횟수를 1, 2, 3번 수포자 순서대로 입력하는 배열을 만들었다 : int[] groups
  • 복사본 배열을 만들어 최대값을 구했다.
  • groups의 값을 최대값과 비교하여 같거나 크면 새로운 배열에 i+1을 입력하였다.
  • 1, 2, 3번 학생 순으로 비교했기 때문에 별도로 오름차순을 하지 않아도 된다.

 

마지막에 List를 stream을 써서 int[]로 변환했는데 테스트당 2~4초 정도 걸렸다.

그런데 for문으로 변환하면 1초 전후로 가능하다.

가급적이면 for문을 쓰는게 더 빠르다.

 

Math.max를 쓰면 2개만 비교할 수 있는데 다음과 같이 겹쳐서 쓰면 3개도 비교할 수 있다.

int maxScore = Math.max(score[0], Math.max(score[1], score[2]));