99클럽 코테 스터디 12일차 TIL [04/15]

[시작]

참여 기간 : 2025/03/31 ~ 2025/04/28

참여 난이도 : 파이썬 / 비기너

⏳ 코테 스터디 진행도 🧱 : [▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰░                         ] 12/29일 (41%)

본 글에서 다룬 문제 : 백준 25757번 : 임스와 함께하는 미니게임

문제 푸는 데 걸린 시간 : 15분 18초

내 풀이 : set 사용

 

 

 

[오늘의 문제]

 

 

 

[문제 해석]

미니게임의 종류는 Y, F, O이고 필요한 인원수는 다음과 같다.

Y : 2명 (임스 + 1명)

F : 3명 (임스 + 2명)

O : 4명 (임스 + 3명)

 

다만, 한 번 임스와 함께한 사람은 다시 못한다.

중복 제거를 해라는 말이다.

동일한 사람이 여러 번 신청해도 1명으로 간주해야 한다.

 

문제 목표 : 임스가 중복 없는 사람들과 최대 몇 번까지 게임할 수 있는지 계산 후 출력

 

 

 

[구현]

▶ 구현할 코드 흐름

  1. 입력으로 신청자 수 N과 게임 종류(G)를 입력받음
  2. N명의 신청자 이름을 한 줄씩 입력받음
  3. 이 신청자 이름들을 중복 없이 저장
    • set 자료구조 사용
  4. 게임 종류에 따라 필요한 인원수(P)를 정함
    • Y면 P = 1
    • F면 P = 2
    • O면 P = 3
  5. 신청한 사람 수를 S라고 할 때
    • 가능한 게임 횟수 = S // P
  6. 결과 출력

 

  • 중복제거는 set
  • 게임별 인원수는 딕셔너리나 조건문으로 관리
  • 나눗셈으로 게임 횟수 계산

 

 

 

[코드]

import sys
input = sys.stdin.readline

N, G = input().split()	# N:사람 수, G:게임종류
N = int(N)
people = set()	# 중복 제거용 자료구조

for i in range(N):
    name = input().strip()
    people.add(name)	# 이름을 set에 추가

need = {"Y": 1, "F": 2, "O" : 3}	# 임스를 제외한 필요한 인원 딕셔너리로 표현
required = need[G]	# 주어진 게임 타입에 따라 필요한 인원 수

print(len(people) // required)	# 중복 없는 사람 수를 required로 나눈 몫 = 게임 가능 횟수

설명은 주석 참고

 

 

 

[제출 결과]

 

 

 

[시간복잡도]

N, G = input().split()             → O(1)
N = int(N)                         → O(1)
people = set()                     → O(1)

for i in range(N):                 → 반복 N번
    name = input().strip()        → O(1) (줄 하나 입력 + 공백 제거)
    people.add(name)              → O(1) 평균 시간 (set 추가)

required = need[G]                 → O(1)
print(len(people) // required)    → O(1)

코드의 최종 시간복잡도는 O(N)

 

 

 

[다른 접근 방법]

  1. dict 사용
    • 딕셔너리 키를 이름으로 사용
    • 근데 set이 더 간결함
  2. Counter 사용
    • 신청 횟수까지 알고 싶으면 사용

 

 

 

[회고]

오늘 문제는 단순 구현으로 끝나는 게 아니라 중복제거가 핵심이었다.

그런데 접근 방법은 잘 떠오르는데 코드 작성하는 정확도가 마음에 들지 않는다.

머리로는 이런 식으로 구현하면 풀 수 있겠다고 생각하지만, 손으로 코드를 작성하는 부분이 아직 아쉽다.

문제를 많이 풀면서 코드 구현을 많이 하면 좋아지지 않을까?