문제
임스가 미니게임을 같이할 사람을 찾고 있습니다.
플레이할 미니게임으로는 윷놀이 , 같은 그림 찾기 , 원카드 가 있습니다. 각각 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(): 모든 공백을 기준으로 문자열을 분리한다.
'[Python] 백준 알고리즘 공부' 카테고리의 다른 글
| [Python] 1205. 등수 구하기 (0) | 2026.02.20 |
|---|---|
| [Phython] 20125. 쿠키의 신체 측정 (0) | 2026.02.20 |
| [Phython] 4659. 비밀번호 발음하기 (0) | 2026.02.18 |
| [Python] 7568. 덩치 (0) | 2026.02.16 |
| [Python] 10431. 줄세우기 (0) | 2026.01.19 |