Coding Test/[Java] 완전 탐색

[프로그래머스 / Java] Lv.1 모의고사 - 연습 문제 (1) with ChatGPT

annovation 2025. 12. 15. 23:35

📘 연습 문제 1  :  리듬 게임 최고 점수자 찾기

 

문제 설명

한 리듬 게임에는 3명의 플레이어가 있습니다.
각 플레이어는 자신만의 버튼 입력 패턴을 반복해서 누릅니다.

게임의 정답 버튼 배열 notes가 주어질 때,
가장 많은 정답을 맞힌 플레이어의 번호를 오름차순으로 반환하세요.


플레이어 입력 패턴

  • 1번 플레이어
[1, 3, 2, 4]
  • 2번 플레이어
[2, 2, 1, 3, 4]
  • 3번 플레이어
[3, 1, 1, 2, 2, 4]

 

각 플레이어는 자신의 패턴을 처음부터 끝까지 반복합니다.


제한 사항

  • notes의 길이는 1 이상 10,000 이하
  • notes의 원소는 1 이상 4 이하의 정수
  • 반환 값은 List<Integer> 형태

입출력 예

notes return
[1,3,2,4,1,3,2,4] [1]
[2,2,1,3,4,2,2,1,3,4] [2]
[1,2,3,4,1,2,3,4] [1,2]

힌트

  • 패턴 길이가 다르다
  • % 연산을 사용하면 패턴 반복을 쉽게 처리할 수 있다
  • 최고 점수가 여러 명일 수 있다

이 문제들로 연습하면 익히는 핵심

  • 패턴 배열 관리
  • i % pattern.length 활용
  • 점수 누적 로직
  • 최대값 계산 후 조건 필터링
  • 결과 리스트 구성

스스로 점검 질문 (중요)

  • 플레이어가 3명이 아니라 N명이라면 배열 구조를 어떻게 바꿀까?
  • 패턴이 입력으로 주어진다면 하드코딩을 제거하려면?
  • 점수 계산 로직을 함수로 분리하면 어떤 장점이 있을까?

Algorithm

  1. 각 플레이어의 입력 패턴을 배열로 정의한다.
    • 플레이어마다 고정된 패턴이 있고, 이 패턴은 반복된다.
    • 이를 int[] 배열로 관리한다.
  2. 각 플레이어가 맞힌 개수를 저장할 배열을 생성한다.
    • score[0], score[1], score[2]는 각각 1·2·3번 플레이어의 점수다.
  3. 모든 문제(노트)를 순회하며 정답 여부를 비교한다.
    • 인덱스 i에 대해
      • i % 패턴길이를 사용해 패턴을 반복 적용한다.
    • 실제 정답(notes[i])과 패턴 값이 같으면 해당 플레이어 점수를 증가시킨다.
  4. 세 플레이어 중 가장 높은 점수를 계산한다.
    • Math.max()를 사용해 최고 점수를 구한다.
  5. 최고 점수를 받은 플레이어를 결과 리스트에 담는다.
    • 점수가 maxScore와 같은 플레이어 번호(i + 1)를 리스트에 추가한다.
    • 자연스럽게 오름차순으로 정렬된다.
  6. 결과 리스트를 반환한다.
    • 가장 높은 점수를 받은 플레이어 번호 목록을 반환한다.

Code

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<Integer> solution(int[] notes) {
        // 각 플레이어의 입력 패턴
        int[] p1 = {1, 3, 2, 4};
        int[] p2 = {2, 2, 1, 3, 4};
        int[] p3 = {3, 1, 1, 2, 2, 4};

        // 점수 저장 배열
        int[] score = new int[3];

        // 정답 비교
        for (int i = 0; i < notes.length; i++) {
            if (notes[i] == p1[i % p1.length]) score[0]++;
            if (notes[i] == p2[i % p2.length]) score[1]++;
            if (notes[i] == p3[i % p3.length]) score[2]++;
        }

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

        // 최고 점수 플레이어 찾기
        List<Integer> answer = new ArrayList<>();
        for (int i = 0; i < score.length; i++) {
            if (score[i] == maxScore) {
                answer.add(i + 1);
            }
        }

        return answer;
    }
}

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

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

programmers.co.kr