티스토리 뷰

www.acmicpc.net/problem/9037

 

9037번: The candy war

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

www.acmicpc.net

 

답이 나오지 않아서 살펴보니 사탕을 나눠주는 과정을 잘못 생각했다.

(왼쪽 친구에게 받은 사탕의 절반 + 원래 갖고 있던 사탕)의 절반을 오른쪽에 주는 것이 아니라.

원래 갖고 있던 사탕의 절반을 오른쪽으로 주고 난 후, 한 회전을 다 돌고 난 후 받은 사탕의 갯수까지 세는 것이다. 

 

또한 리스트 내의 모든 요소가 같은 값을 가지는지 확인하는 방법은, 리스트를 set에 넣어서 길이가 1인지 살펴보면 된다.

T = int(input())
for _ in range(T):
    N = int(input()) # 아이들의 인원
    candy = list(map(int, input().split()))
    cnt = 0

    while True:
        # 처음부터 홀수 개의 사탕을 가지고 있으면 선생님이 1개씩 보충 해준다.
        for i in range(N):
            if candy[i] % 2 != 0:
                candy[i] += 1
        if min(candy) == max(candy):
        # if len(set(candy)) == 1:
            print(cnt)
            break
        else:
            cnt += 1
            next_candy = [0]*N
            for i in range(N):
                if candy[i] % 2 != 0:
                    candy[i] += 1 # 홀수 개인 경우 선생님이 보충 해준다.
                candy[i] //= 2
                next_candy[(i+1)%N] = candy[i]
            
            for i in range(N):
                candy[i] += next_candy[i]

 

함수로 풀어보기

def check(N, candy):
    for i in range(N):
        if candy[i] % 2 == 1:
            candy[i] += 1
    return len(set(candy)) == 1

def teacher(N, candy):
    next_candy = [0] * N
    # 오른쪽 친구한테 사탕 분배
    for i in range(N):
        if candy[i] % 2 == 1:
            candy[i] += 1
        candy[i] //= 2
        next_candy[(i+1)%N] = candy[i]
    # 분배받은 사탕 더하기
    for i in range(N):
        candy[i] += next_candy[i]
    
    return candy

def process():
    N = int(input())
    candy = list(map(int, input().split()))
    cnt = 0
    while not check(N, candy):
        cnt += 1
        candy = teacher(N, candy)
    print(cnt)

for i in range(int(input())):
    process()

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함