[Python] 백준 알고리즘 공부

[Phython] 25757. 임스와 함께하는 미니게임

0pinq2 2026. 2. 18. 17:08

문제

임스가 미니게임을 같이할 사람을 찾고 있습니다.

플레이할 미니게임으로는 윷놀이 , 같은 그림 찾기 , 원카드 가 있습니다. 각각 2, 3, 4 명이서 플레이하는 게임이며 인원수가 부족하면 게임을 시작할 수 없습니다.

사람들이 임스와 같이 플레이하기를 신청한 횟수 과 임스가 플레이할 게임의 종류가 주어질 때, 최대 몇 번이나 임스와 함께 게임을 플레이할 수 있는지 구하시오.

임스와 여러 번 미니게임을 플레이하고자 하는 사람이 있으나, 임스는 한 번 같이 플레이한 사람과는 다시 플레이하지 않습니다.

임스와 함께 플레이하고자 하는 사람 중 동명이인은 존재하지 않습니다. 임스와 lms0806은 서로 다른 인물입니다.


첫 번째 줄에는 사람들이 임스와 같이 플레이하기를 신청한 횟수 과 같이 플레이할 게임의 종류가 주어진다.

두 번째 줄부터 개의 줄에는 같이 플레이하고자 하는 사람들의 이름이 문자열로 주어진다.  문자열 길이 <=

사람들의 이름은 숫자 또는 영문 대소문자로 구성되어 있다.

풀이

입력으로 중복된 문자열들이 들어올 수 있고, 그걸 걸러내야 한다는 데에서 이 문제는 list가 아닌 set을 활용하여 푸는 문제라는 것을 깨달았다. 인원수, 게임 종류는 앞에서 따로 받아놓은 뒤 for문을 이용하여 문자열들을 set에 집어넣고, 정수 나눗셈 //을 활용하여 게임 종류에 따라 값이 알맞게 출력되도록 하였다.

첫 번째 코드

import sys

input = sys.stdin.readline

n, g = input().split()
n = int(n)
players = {input().strip() for _ in range(n)}

if g == "Y":
    print(len(players) // 1)
elif g == "F":
    print(len(players) // 2)
else:
    print(len(players) // 3)

이미 구현은 깔끔하게 잘 되었지만, N의 최대값이 10만인 것을 보고 조금 더 코드를 효율적으로 수정할 수 있을지 찾아보고 개선해 보았다.

 

1. sys.stdin.read().splitlines(), 리스트 슬라이싱으로 입력 시간 축소

: for문을 n번 돌리던 기존 방식 대신 한 번에 모든 입력을 받아 \n 기준으로 리스트로 만들고, 리스트 슬라이싱을 활용해 문자열 list를 한 번에 set에 집어넣도록 수정하였다.

 

2. if-else문 대신 딕셔너리 활용

: if-else문을 활용하여 게임 종류가 무엇인지 하나하나 검사하는 대신, 게임 종류를 나타내는 알파벳과 필요 인원수를 매치해 딕셔너리로 선언하였다.

 

최종 코드

import sys

data = sys.stdin.read().splitlines()
n, g = data[0].split()
players = set(data[1 : int(n) + 1])
more = {"Y": 1, "F": 2, "O": 3}

print(len(players) // more[g])

코드가 훨씬 간단해졌고, 소요 시간도 줄어들었다 ㅎㅎ

배운 것

  • // : 정수 몫을 얻기 위해선 정수 나눗셈 기호(//)를 사용해야 한다. / 를 사용할 경우 소수점 첫째 자리까지 출력됨
  • str.split(): 모든 공백을 기준으로 문자열을 분리한다.