[시작]
참여 기간 : 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명으로 간주해야 한다.
문제 목표 : 임스가 중복 없는 사람들과 최대 몇 번까지 게임할 수 있는지 계산 후 출력
[구현]
▶ 구현할 코드 흐름
- 입력으로 신청자 수 N과 게임 종류(G)를 입력받음
- N명의 신청자 이름을 한 줄씩 입력받음
- 이 신청자 이름들을 중복 없이 저장
- set 자료구조 사용
- 게임 종류에 따라 필요한 인원수(P)를 정함
- Y면 P = 1
- F면 P = 2
- O면 P = 3
- 신청한 사람 수를 S라고 할 때
- 가능한 게임 횟수 = S // P
- 결과 출력
- 중복제거는 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)
[다른 접근 방법]
- dict 사용
- 딕셔너리 키를 이름으로 사용
- 근데 set이 더 간결함
- Counter 사용
- 신청 횟수까지 알고 싶으면 사용
[회고]
오늘 문제는 단순 구현으로 끝나는 게 아니라 중복제거가 핵심이었다.
그런데 접근 방법은 잘 떠오르는데 코드 작성하는 정확도가 마음에 들지 않는다.
머리로는 이런 식으로 구현하면 풀 수 있겠다고 생각하지만, 손으로 코드를 작성하는 부분이 아직 아쉽다.
문제를 많이 풀면서 코드 구현을 많이 하면 좋아지지 않을까?
'스파르타 코딩클럽 > 99클럽 코딩테스트 스터디 6기' 카테고리의 다른 글
99클럽 코테 스터디 14일차 TIL [04/17] (0) | 2025.04.17 |
---|---|
99클럽 코테 스터디 13일차 TIL [04/16] (0) | 2025.04.16 |
99클럽 코테 스터디 11일차 TIL [04/14] (0) | 2025.04.14 |
99클럽 코테 스터디 10일차 TIL [04/11] (0) | 2025.04.11 |
99클럽 코테 스터디 9일차 TIL [04/10] (0) | 2025.04.10 |