내코가석자

02-3. 모의고사 (프로그래머스, JAVA)

gani00 2026. 3. 11. 16:50

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

문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

세 명의 수포자가 각각 정해진 패턴으로 문제를 찍는다.
실제 정답 배열이 주어졌을 때 가장 많이 맞춘 사람을 구하는 문제이다.


🧠 풀이 과정

1️⃣ 문제 분석

 

각 수포자는 다음과 같은 반복 패턴으로 답을 찍는다.

수포자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

 

  • 패턴이 반복된다
  • answers 배열 길이는 최대 10,000

따라서 문제를 해결하려면 answers 배열과 수포자 패턴을 비교해야 함

 

 

2️⃣ 접근 방식

이 문제는 완전탐색(Brute Force) 문제이다.

가능한 모든 경우를 직접 확인하자!

=> 

answers 배열 전체를 순회하면서 각 수포자의 패턴과 비교 해보자

 

시간복잡도

O(N)

 

 

3️⃣ 핵심 아이디어

✔ 패턴 반복 처리

문제의 핵심은 패턴이 반복된다는 것이다.

예를 들어 수포자1 패턴

1 2 3 4 5

문제가 10개라면

1 2 3 4 5 1 2 3 4 5

처럼 반복된다.

이를 해결하는 방법이 바로 나머지 연산(%)이다.

pattern[i % pattern.length]

예시

soopoja1[i % 5]

 

4️⃣ 알고리즘 설계

1. 수포자 패턴 배열 생성
2. answers 배열 순회
3. 정답 비교 후 점수 증가
4. 최고 점수 찾기
5. 최고 점수자를 결과 배열에 추가

 


💻 최종 코드

import java.util.*;

class Solution {

    public int[] solution(int[] answers) {

        int[] soopoja1 = {1, 2, 3, 4, 5};
        int[] soopoja2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] soopoja3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int[] score = new int[3];

        // 정답 비교
        for(int i = 0; i < answers.length; i++){

            if(answers[i] == soopoja1[i % 5]){
                score[0]++;
            }

            if(answers[i] == soopoja2[i % 8]){
                score[1]++;
            }

            if(answers[i] == soopoja3[i % 10]){
                score[2]++;
            }
        }

        // 최고 점수 찾기
        int max = Math.max(score[0], Math.max(score[1], score[2]));

        List<Integer> list = new ArrayList<>();

        // 최고 점수자 찾기
        for(int i = 0; i < score.length; i++){
            if(score[i] == max){
                list.add(i + 1);
            }
        }

        // List → 배열 변환
        return list.stream()
                   .mapToInt(Integer::intValue)
                   .toArray();
    }
}

⏱ 시간복잡도

정답 배열을 한 번 순회

O(N)

최대 문제 수

10,000

따라서 충분히 빠르게 실행된다.


🚀 정리

이 문제에서 기억해야 할 핵심은 다음 3가지이다.

1️⃣ 완전탐색 (Brute Force)
2️⃣ 패턴 반복 처리 (% 연산)
3️⃣ 최대값 찾기

특히 나머지 계산!

i % pattern.length

 

 

'내코가석자' 카테고리의 다른 글

02-2. 두 개 뽑아서 더하기 (프로그래머스, JAVA)  (0) 2026.03.11
02-1. 배열 몸풀기 문제  (0) 2026.03.11
02. 배열  (0) 2026.03.07
01. 필수 문법  (0) 2026.03.07
00. 코딩 테스트 준비  (0) 2026.03.07