[BOJ] 25757번 - 임스와 함께하는 미니게임

dev_yuni·2024년 12월 2일
1

알고리즘

목록 보기
5/6
post-thumbnail

👀 문제 분석

백준 - 임스와 함께하는 미니게임

  • 플레이할 수 있는 미니게임 - 플레이할 수 있는 인원수
    (인원수가 부족하면 게임을 시작할 수 없다.)
    - 윷놀이 Y - 2
    - 같은 그림찾기 F - 3
    - 원카드 O - 4
  • 같이 플레이하기를 신청한 횟수 N과 위의 주어진 게임 중 플레이할 게임의 종류를 입력받고 최대 몇 번이나 함께 게임을 플레이할 수 있는지 구하면 된다.

한 번 같이 플레이한 사람과는 다시 플레이하지 않는다.
또한, 동명이인은 존재하지 않는다.

입력 조건

  • 1 ≤ N ≤ 100,000
  • 1 ≤ 문자열 길이 ≤ 20
  • 이름은 숫자 또는 영문 대소문자로 이루어져있다.

⚒️ 설계

입력

  1. 플레이할 횟수와 게임 종류를 입력받는다.
  2. 이후 플레이할 횟수만큼 플레이어의 이름을 입력받는다.

검증

  1. 입력한 이름이 숫자 또는 영문 대소문자로 이루어져있는지
  2. 문자열이 20자를 초과하지 않는지

계산

  1. 기준 이름을 제외한 이름을 HashSet에 저장하여 중복되는 이름을 제거한다.

  2. 기준이 되는 플레이어는 무조건 포함되므로 해당 규칙에 맞게 계산한다.

    ex) 기준 이름 : lms0806
    플레이어 이름 : { lms0806, exponentiale, jthis, leo020630 } - 4
    게임 규칙 (Y-2) : 무조건 기준은 포함 4//1 = 4

    ex) 기준 이름 : lms0806
    플레이어 이름 : { powergee, skeep194, lms0806, tony9402, wider93, mageek2guanaah, jthis } - 7
    게임 규칙 (F-3) : 7//2 = 3

    ex) 기준 이름 : lms0806
    플레이어 이름 : { mageek2guanaah, jthis, lms0806, exponentiale, leo020630, powergee, skeep194 } - 7
    게임 규칙 (O-4) : 7//3 = 2

📝 코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        String gameType = st.nextToken();

        Map<String, Integer> gameRules = getRules();
        int requiredPlayers = gameRules.get(gameType);

        String mainPlayer = br.readLine().trim();
        Set<String> uniquePlayers = new HashSet<>();
        uniquePlayers.add(mainPlayer);

        for (int i = 1; i < n; i++) {
            String playerName = br.readLine().trim();
            if (isValidName(playerName)) {
                uniquePlayers.add(playerName);
            }
        }

        int totalPlayers = uniquePlayers.size();
        int maxGames = totalPlayers / (requiredPlayers - 1);

        System.out.println(maxGames);
        br.close();
    }

    private static Map<String, Integer> getRules() {
        return Map.of(
                "Y", 2,
                "F", 3,
                "O", 4
        );
    }

    private static boolean isValidName(String name) {
        if (name.length() > 20) {
            return false;
        }

        return name.matches("[a-zA-Z0-9]+");
    }

}

⌛️ 시간복잡도

N을 이름 수라고 정의

  • 검증 및 중복 제거 : O(N)O(N)
  • 계산 : O(1)O(1)
O(N)O(N)

👩🏻‍💻 느낀점

이미 예제가 입력 요구 조건에 잘 맞추어 입력된다.
그래서 검증 과정이 없을 때도 정상적으로 작동하였다. 하지만 테스트 케이스가 여러 개 나올 경우를 생각하여 검증 과정을 포함해서 작성하였다.
풀이 후에 보니 게임 종류 외에 다른 문자열이 입력되었을 때의 상황은 생각하지 못해 예외 처리를 하지 못했다.
그래도 재미있었다.

✔️ 소요 시간 : 30분

profile
꾸준히 성장하는 백엔드 개발자

0개의 댓글