쉬운 프로그래밍

[알고리즘] 프로그래머스 - 모의고사 - JAVA 본문

알고리즘/Brute Force

[알고리즘] 프로그래머스 - 모의고사 - JAVA

쉬운형 2021. 8. 14. 15:52

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

 

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

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

programmers.co.kr

문제 설명

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

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

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

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

풀이과정

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 규칙으로 문제를 찍는다.

 

이렇게 각각 세사람이 문제를 찍었을 때, 가장 문제를 많이 맞추는 사람을 찾는 문제이다. 가장 많이 맞춘 숫자가 동일한 사람이 있는 경우 오름차순으로 정렬하여 반환한다.

 

풀이 자체는 간단한데, 입력으로 주어진 정답 배열을 선형탐색하면서 조건문을 통해 현재 반복문 인덱스값과 각각 사람들의 찍은 값을 비교해서 정답인 숫자를 카운트한다.

 

비교하는 규칙은 예를 들어 첫번째 사람인 경우에는 1, 2, 3, 4, 5 ... 와 같은 규칙을 가지므로 n % 5 연산을 통해 비교인덱스를 구한다. ex) i = 7 ->  7 % 5 -> 2 

 

그렇게 나온 값들을 정렬하여 정답을 구한다.

 

나같은 경우는 따로 클래스를 만들어 comparable을 통해 정렬을 수행했는데 (숫자와 사람을 함께 알 수 있기 위해서)

 

다른 사람들 풀이를 보니 굳이 이렇게 안하는 사람이 대다수기는 했다.

 

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] first = {1, 2, 3, 4, 5};
        int[] second = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] third = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        List<Pair> list = new ArrayList<>();
        list.add(new Pair(1, 0));
        list.add(new Pair(2, 0));
        list.add(new Pair(3, 0));
        
        for (int i = 0; i < answers.length; i++) {
            if (first[i % 5] == answers[i]) {
                list.get(0).y++;
            }
            
            if (second[i % 8] == answers[i]) {
                list.get(1).y++;
            }
            
            if (third[i % 10] == answers[i]) {
                list.get(2).y++;
            }
        }
        
        Collections.sort(list, (o1, o2) -> o2.y - o1.y);
        
        int size = 1;
        
        for (int i = 0; i < list.size() - 1; i++) {
            if (list.get(i).y == list.get(i + 1).y) {
                size++;
            }
            else break; 
        }
        
        int[] answer = new int[size];
        
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i).x;
        }
        
        return answer;
    }
    
    private class Pair {
        int x;
        int y;
        
        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
Comments