프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 모의고사(Java)

Sigfriede 2023. 7. 5. 01:00

  문제 설명

  수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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번 문제부터 마지막 문제까지 정답이 순서대로 들은 배열 answer가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

  제한사항

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

 

  입출력 예

answer return
[1, 2, 3, 4, 5] [1]
[1, 3, 2, 4, 2] [1, 2, 3]
import java.util.ArrayList;
class Solution {
    public int[] solution(int[] answers) {
        int[] one = {1, 2, 3, 4, 5};
        int[] two = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int oneA = 0;
        int twoA = 0;
        int threeA = 0;
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == one[i % one.length]) {
                oneA++;
            }
            if (answers[i] == two[i % two.length]) {
                twoA++;
            }
            if (answers[i] == three[i % three.length]) {
                threeA++;
            }
        }
        int[] arr = {oneA, twoA, threeA};
        ArrayList<Integer> list = new ArrayList<>();
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                list.clear();
                max = arr[i];
                list.add(i + 1);
            } else if (arr[i] == max) {
                list.add(i + 1);
            }
        }
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

  배열 one, two, three를 생성합니다. 이는 각 수포자가 문제를 찍는 방식을 배열에 담은 것입니다.

  변수 oneA, twoA, threeA를 생성합니다. 이는 각 수포자가 문제를 맞힌 개수를 의미합니다.

  for문이 answers의 길이만큼 순회합니다.

  첫 번째 if문에서 answers의 i번째 원소가 one의 i를 one의 길이로 나눈 나머지 번째 원소와 같다면 oneA가 증가합니다.

  두 번째 if문에서 answers의 i번째 원소가 two의 i를 two의 길이로 나눈 나머지 번째 원소와 같다면 twoA가 증가합니다.

  세 번째 if문에서 answers의 i번째 원소가 three의 i를 three의 길이로 나눈 나머지 번째 원소와 같다면 threeA가 증가합니다. i를 배열의 길이만큼 나누는 이유는 answer 배열의 길이가 각 수포자의 배열의 길이보다 길 수 있기 때문입니다.

  배열 arr를 생성하여 각 수포자의 점수를 담습니다.

  ArrayList를 생성합니다. answer 배열의 크기가 모호하기 때문입니다. 최고점과 동일한 점수를 받은 수포자가 있을 수 있습니다.

  최고점을 담을 변수 max를 생성합니다.

  for문이 arr의 길이만큼 순회합니다.

  if문에서 arr의 i 번째 원소가 max보다 크다면 clear 메소드를 이용하여 list를 초기화합니다.

  max를 arr의 i 번째 원소로 갱신합니다.

  i + 1을 리스트에 추가합니다. i + 1은 수포자의 번호를 의미합니다. 배열의 인덱스는 0부터 시작하므로 1을 더해주었습니다.

  else if에서 arr의 i번째 원소가 max와 동일하다면 최고점과 동일한 점수를 받은 학생이라는 뜻입니다. 따라서 add 메소드를 이용하여 i + 1을 추가합니다.

  앞서 구한 ArrayList를 Array로 복사하는 일만 남았습니다. answer 배열의 크기를 list의 size로 지정합니다.

  for문이 list의 size만큼 순회합니다.

  answer의 i 번째 원소에 list의 i 번째 원소를 할당합니다.