본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 모의고사(C#)

by jyppro 2023. 9. 6.

모의고사

오늘은 모의고사 시험을 보는 날입니다.... 아니 완전탐색 카테고리의 코딩테스트 문제 "모의고사"를 풀어보는 날입니다. 이상한 소리 그만하고 바로 본론으로 들어가도록 하겠습니다.

 

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

 

입출력 예

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

 

입출력 예 설명

입출력 예 #1
수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.

 

시작 코드

using System;

public class Solution {
    public int[] solution(int[] answers) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

나의 풀이

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int[] answers) {
        int[] supo1 = new int[5] {1, 2, 3, 4, 5};
        int[] supo2 = new int[8] {2, 1, 2, 3, 2, 4, 2, 5};
        int[] supo3 = new int[10] {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int[] score = new int[3] {0, 0, 0};
        int max = 0;
        List<int> nList = new List<int>();
        
        for(int i = 0; i < answers.Length; i++)
        {
            if(supo1[i % 5] == answers[i]) { score[0]++; }
            if(supo2[i % 8] == answers[i]) { score[1]++; }
            if(supo3[i % 10] == answers[i]) { score[2]++; }
        }
        
        for(int i = 0; i < 3; i++) { if(max < score[i]) { max= score[i]; } }
        for(int i = 0; i < 3; i++) { if(max == score[i]) { nList.Add(i+1); } }
        
        return nList.ToArray();
    }
}

 

코드 분석

리스트를 사용하기 위한 using 지시문 Collections.Generic을 선언하고, int형 배열 answers가 주어지며 코드가 시작됩니다.

가장 먼저, int형 배열로 수포자 삼인방이 각각 문제를 찍는 패턴을 순서대로 저장해줍니다. 그리고 수포자들의 점수를 담을 수 있는 score배열도 만들어 0,0,0으로 초기화 해줍니다. int형 max를 0으로 선언해주고, nlist 라는 이름으로 int형 리스트를 만들어 줍니다. 이후 for문을 독립적으로 총 3번 돌리는데 각 for문에는 if문이 들어가 있습니다.

 

첫번째 for문은 i = 0 부터 answers의 길이만큼 돌리고, 각 수포자들의 찍는 패턴의 개수로 i를 나눈 나머지의 인덱스가 answers[i]와 같다면 각 수포자들의 점수를 올려줍니다.

 

두번째와 세번째 for문은 0부터 3까지 돌아가며 두번째는 만약 max가 score[i]보다 작으면 max에 score[i]를 넣어줍니다.

세번째는 max와 score[i]가 같을 때, nlist에 i + 1을 추가해 줍니다. 그리고 최종적으로 nlist를 배열의 형태로 바꾸어 리턴해줍니다.

 

풀이 설명

이번 문제에서 원하는 것은 세 명의 수포자가 각각 자신만의 방식으로 문제를 찍을 때, 정답을 가장 많이 맞춘 친구가 몇번째 수포자인지를 리턴하는 것입니다. 위 풀이방식에서는 각 수포자가 찍는 패턴을 선언해주고 시작합니다.

첫번째 for문은 각 수포자별로 찍은 문제가 맞았는지 체크해주며 점수를 올려주는 역할, 두번째는 산출된 점수를 비교해 최대값을 찾는 역할, 세번째는 구해진 최대값과 같은 점수를 가지는 수포자의 번호를 리스트에 담는 역할을 합니다. 그리고 리스트에 담긴 것은 배열 형태로 변환되어 리턴됩니다.

 

<NEXT>

과정은 생각보다 간단했지만, 처음에 수포자들의 패턴을 정의하는 것이 하드코딩이라는 느낌을 주기 때문에 거부감이 들수도 있습니다. 하지만 의외로 이런 방식이 더 쉽고 빠르게 푸는 방법이 될 때도 있는 것 같습니다. 오늘은 완전탐색 카테고리에 속하는 "모의고사" 문제를 풀어보았습니다. 다음에는 Summer/Winter Coding(~2018)에 출제 되었던 "소수 만들기" 문제를 다뤄보도록 하겠습니다. 감사합니다.