Programming/백준
[브론즈 2] 백준 1592 - 영식이와 친구들 (파이썬)
pental
2025. 9. 11. 09:53
https://www.acmicpc.net/problem/1592
총 N명의 친구들이 원형으로 앉아 있다. 공을 가진 사람이 공을 던질 때, 현재 그 사람이 받은 횟수가 홀수라면 오른쪽 L번째 있는 사람에게, 짝수라면 왼쪽으로 L번째 있는 사람에게 공을 던진다.
특정 친구가 공을 M번 받으면 게임이 끝나고, 공을 총 몇 번 던졌는지 출력하는 문제이다.
먼저 배열로 각 친구의 공 받은 횟수를 기록한다.
N, M, L = map(int, input().split())
A = [0] * N
최초의 배열은 [0]으로 초기화 하였으며, N, M, L 은 map을 통해서 입력 받는다.
while max_ball != M :
A[index] += 1
max_ball = max(max_ball, A[index])
if max_ball == M :
break
if A[index] < M and A[index] % 2 == 1 :
index += L
if index >= N :
index -= N
elif A[index] < M and A[index] % 2 == 0 :
index -= L
if index < 0 :
index += N
result += 1
핵심 로직은 위 부분이다. 먼저 공을 줬기 때문에 A의 현재 인덱스에 1을 증가시키고, 현재의 공의 갯수와, 가장 많은 공을 잡은 사람의 횟수를 비교하여 M과 동일하다면 종료한다.
왼쪽과 오른쪽으로 나누기 위해서 만약 N명의 범위가 초과 하거나 미만인경우 적절하게 +-를 통해서 N으로 증감해주었다.
사실은 인덱스 갱신 부분을 더 깔끔하게 쓰려면 mod 연산을 바로 사용하면 된다.
if A[index] % 2 == 1: # 홀수
index = (index + L) % N
else: # 짝수
index = (index - L) % N
전체 코드
# [브론즈 2] 백준 1592 - 영식이와 친구들
N, M, L = map(int, input().split())
A = [0] * N
# A[0] = 1
max_ball = 0
index = 0
result = 0
while max_ball != M :
A[index] += 1
max_ball = max(max_ball, A[index])
if max_ball == M :
break
if A[index] < M and A[index] % 2 == 1 :
index += L
if index >= N :
index -= N
elif A[index] < M and A[index] % 2 == 0 :
index -= L
if index < 0 :
index += N
result += 1
print(result)