Python/백준 (BOJ)

[BOJ][B2]영식이와 친구들 - 1592

ㅋㅋ! 2025. 8. 5. 14:05

https://www.acmicpc.net/problem/1592

문제 전문은 링크 참조

 

문제 가공

문제를 풀기위한 규칙성을 찾아 정리하자.

  1. N = 사람수, M = 게임오버카운트 , L = 간격
  2. 공을 받은 횟수가
    짝수면 좌측으로 L만큼,
    홀수면 우측으로 L만큼.
  3. 공을 받은사람이 공을 M번 받으면 게임끝
  4. 공을 던진 회수를 출력
  5. 공을 처음 가지고 시작하는 사람은 받은회수가 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