백준 1592번: 영식이와 친구들

최창효·2022년 1월 11일
0
post-thumbnail


문제 설명

접근법

  • 원형 문제는 나머지로 계산할 수 있습니다.
    • 파이썬의 나머지는 %로 구할 수 있습니다.
    • 원탁에 앉아 있는 3명에게 반시계 방향으로 1~8번 카드를 나눠준다고 가정해 보겠습니다.

      1은 첫번째 사람이, 2는 두번째 사람이, 3은 세번째 사람이
      4는 첫번째 사람이, 5는 두번째 사람이, 6은 세번째 사람이
      7은 첫번째 사람이, 8은 두번째 사람이 가집니다

  • N명이 공을 받은 횟수를 모두 기억해야 하기 때문에 배열을 활용합니다.
  • 반시계방향은 -(빼기)abs(절댓값)으로 구할 수 있습니다.

정답

N,M,L = list(map(int,input().split(' ')))

lst = [0]*N #공을 받은 횟수를 기억하기 위해 빈 배열을 만듭니다

#초기값을 적어줍니다
idx = 0 #첫번째 사람의 idx는 0입니다
lst[idx] = 1 #최초 1번이 공을 받습니다
cnt = 0 #cnt는 총 공을 던지는 횟수입니다
while True:
    
    if lst[idx] == M: #(idx+1)번째 사람이 M번의 공을 받았다면
        print(cnt) #정답을 출력한 뒤
        break #반복문을 멈춥니다

    if lst[idx]%2 == 0: #(idx+1)번째 사람이 짝수번째로 공을 받았으면
        idx = abs((idx-L) %N) # abs((idx-L)%N번째 사람에게 공을 줍니다 (시계 반대방향으로 공을 돌립니다)
        lst[idx] +=1 #공을 받은 사람의 횟수를 증가시킵니다
        cnt+=1 #전체 공이 움직인 횟수를 증가시킵니다
    else: #(idx+1)번째 사람이 홀수번째로 공을 받았으면
        idx=(idx+L)%N #시계방향으로 공을 돌립니다
        lst[idx] +=1
        cnt+=1

기타

  • 파이썬의 배열 인덱스는 0부터 시작하기 때문에 혼란이 발생할 수 있습니다. 이런 경우 두 가지 방법이 있습니다.
    • 길이가 N+1인 배열을 만들어 i번째 사람을 배열의 i번째에 넣어 사용합니다.
    • i번째 사람을 배열의 i-1번째 자리에 넣어 사용합니다.
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글