https://www.acmicpc.net/problem/1592
문제 전문은 링크 참조
문제 가공
문제를 풀기위한 규칙성을 찾아 정리하자.
- N = 사람수, M = 게임오버카운트 , L = 간격
- 공을 받은 횟수가
짝수면 좌측으로 L만큼,
홀수면 우측으로 L만큼. - 공을 받은사람이 공을 M번 받으면 게임끝
- 공을 던진 회수를 출력
- 공을 처음 가지고 시작하는 사람은 받은회수가 1로 시작.
하지만 공을 던진것은 아니므로, 던진회수가 추가 되진 않는다.
코드 작성
- dict를 사용
- dict.get(key,0) = dict 에 key값이 없으면 0으로 return
N,M,L = map(int, input().split()) # N : 사람 수 , M : 게임오버 카운터 , L : 공을 던지는 간격
cnt_balls = {}
cnt_balls[0] = 1 # 1번사람이 공을가지고 시작
holdplayer = 0
answer = 0
while(True):
if cnt_balls.get(holdplayer,-1) == M: # holdplayer가 공을 M번 받으면 게임오버
print(answer)
break
if cnt_balls.get(holdplayer,0) % 2 == 1 : # 홀수면 시계방향으로 L 번째사람
holdplayer = (holdplayer + L ) % N
else: # 짝수면 반시계방향으로 L번째 사람
holdplayer = holdplayer - L
if holdplayer < 0: # 음수가 되면 한바퀴 돌았다는뜻
holdplayer = holdplayer + N
cnt_balls[holdplayer] = cnt_balls.get(holdplayer, 0) + 1 # holdplayer가 dict에 없으면 default값 0
answer +=1
리뷰
이런 문제들은 '이상','초과' 또는 '이하','미만'과 같이 현재 수의 포함여부와 카운터 시점이 헷갈린다.
'Python > 백준 (BOJ)' 카테고리의 다른 글
| [BOJ][B2]암호- 1718 (0) | 2025.08.10 |
|---|---|
| [BOJ][B2]손익분기점-1712 (1) | 2025.08.09 |
| [BOJ][B2]줄 세우기 - 1681 (1) | 2025.08.08 |
| [BOJ][B2]치킨 쿠폰 - 1673 (1) | 2025.08.07 |
| [BOJ][B2]트로피 진열 - 1668 (1) | 2025.08.06 |