본문 바로가기
JAVA/프로그래머스

프로그래머스 Level 1 – 모의고사(Java) 풀이

by ian's coding 2025. 11. 18.
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
반응형

댓글