본문 바로가기

Algorithm

[파이썬] 백준 9037번: The candy war

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

 

9037번: The candy war

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각각의 테스트 케이스의 첫 줄에는 아이의 인원 N (1 ≤ N ≤ 10)이 주어지고 그 다음 줄에

www.acmicpc.net

 
from collections import deque

def check(candy):
    if candy % 2 != 0:
        candy += 1
    return candy

def solution(n, new_c):
    cnt = 0
    if n == 1:
        return 0
    if len(set(new_c)) == 1:
        return 0
    while len(set(new_c)) != 1:
        to_give = [x//2 for x in new_c]
        after_half = deque(to_give)
        after_half.rotate(1)
        after_give = [x+y for x, y in zip(to_give, after_half)]
        after_check = [check(x) for x in after_give]
        new_c = after_check
        cnt += 1
    return cnt

for _ in range(int(input())):
    t = int(input())
    n = list(map(int, input().split()))
    new_c = [check(x) for x in n]
    print(solution(n, new_c))

 

1. 캔디가 홀수일 경우, 해당 캔디를 가진 아이에게 하나를 더 주는 (+=1) check 함수를 생성합니다.

2. 만약 아이가 혼자거나 캔디를 줬을때, 모든 캔디가 같으면 그대로 0을 출력합니다.

3. 그게 아니라면, 전체 캔디 수가 같아질 때까지 while문을 돌립니다.

  • 캔디를 반으로 나눈 값을 가진 list를 생성합니다.
  • deque의 rotate를 사용하여 해당 캔디를 오른쪽으로 넘겨주게끔 구현합니다.
  • (예: 반으로 나눈 후의 캔디가 [1, 2, 2, 4, 6] 일 경우, 여기에 오른쪽으로 rotate 1을 한 [6, 1, 2, 2, 4]를 더해주면 오른쪽으로 캔디를 준 것이 됩니다.)
  • 받은 후의 캔디가 홀수일 경우, check 함수를 통해 +1을 해줍니다. 그리고 cnt += 1을 해줍니다.
  • 최종적으로 cnt값을 출력합니다.