728x90
반응형
📝 프로그래머스 Level 1 – 모의고사(Java) 풀이
이 문제는 세 명의 수포자가 찍는 방식이 각각 다르다는 설정으로 시작한다.
우리가 해야 할 일은 **실제 정답 배열을 기준으로 가장 많은 문제를 맞힌 사람(들)**을 구하는 것.
문제 자체는 난이도가 높지 않지만, 반복 패턴을 처리하는 방법과
여러 명 중 최댓값을 뽑아내는 로직을 깔끔하게 짜는 것이 핵심이다.
📌 문제 요약
- answers: 실제 시험 정답 배열
- p1, p2, p3: 수포자 1~3번의 반복되는 찍기 패턴
- 각 수포자가 몇 문제를 맞췄는지 계산한 뒤
- 가장 높은 점수를 받은 사람 번호를 오름차순 배열로 반환하기
🧠 풀이 핵심 포인트
✔ 1. 패턴은 반복되므로 나머지 연산(mod) 사용
예) 수포자 1의 패턴 길이 = 5
→ i번째 문제의 비교는 p1[i % 5] 로 하면 깔끔하게 처리된다.
✔ 2. 정답 비교하며 각 수포자의 점수 누적
cnt[0], cnt[1], cnt[2] 에 각각의 점수 저장.
✔ 3. 가장 큰 점수를 찾는다
최댓값을 구한 뒤,
동일한 점수를 가진 수포자를 모두 리스트에 넣는다.
✔ 4. 리스트를 배열로 변환하여 반환
Java에서는 stream().mapToInt() 사용해서 변환하면 편하다.
🧩 자바 코드 (Java)
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
List<Integer> answer = new ArrayList<>();
int[] p1 = new int[]{1, 2, 3, 4, 5};
int[] p2 = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
int[] p3 = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] cnt = new int[3];
for(int i = 0; i < answers.length; i++){
if(answers[i] == p1[i % 5]) cnt[0]++;
if(answers[i] == p2[i % 8]) cnt[1]++;
if(answers[i] == p3[i % 10]) cnt[2]++;
}
int max = Integer.MIN_VALUE;
for(int c : cnt){
if(c > max) max = c;
}
for(int i = 0; i < 3; i++){
if(cnt[i] == max) answer.add(i + 1);
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
🔍 간단한 예시
예를 들어 정답이 [1,3,2,4,2] 라면,
- 1번: 2개 정답
- 2번: 1개 정답
- 3번: 2개 정답
→ 최고 점수는 2
→ 1번과 3번이 반환된다 → [1, 3]
🎯 최종 정리
- 반복 패턴 → 나머지 연산
- 각 수포자 정답 여부 카운트
- 최댓값 찾아서 사람 번호 반환
문제 자체는 쉬운 편이라 구현 연습용으로 딱 좋다.
실수만 없다면 금방 풀 수 있는 문제다.
728x90
반응형
'JAVA > 프로그래머스' 카테고리의 다른 글
| 프로그래머스 Level 2 – 카펫(Java) 풀이 (0) | 2025.11.18 |
|---|---|
| 프로그래머스 Level 2 – 소수 찾기(Java, 완전탐색 + 백트래킹) (0) | 2025.11.18 |
| 프로그래머스 Level 1 – 최소직사각형(Java) (0) | 2025.11.18 |
| 프로그래머스 Level 3 – 여행경로(Java, DFS 백트래킹) 풀이 (0) | 2025.11.18 |
| 프로그래머스 Level 3 – 아이템 줍기(Java, BFS + 테두리 따라가기) (0) | 2025.11.18 |
댓글