📘 [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 |