study/백준(BOJ)

[Python] 1679. 숫자놀이

bbooo 2023. 5. 17. 18:28
728x90

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

 

1679번: 숫자놀이

홀순이(holsoon)와 짝순이(jjaksoon) 둘이서 숫자 게임을 한다. 예를 들어, 정수 1과 3이 주어지고, 이 둘을 통틀어 5번까지 마음대로 사용하여 그 합을 구하여 1,2,3,…을 만드는 놀이다. 이 경우 먼저

www.acmicpc.net

접근법

  • dp로 숫자를 만드는데 사용하는 num_list 내 숫자의 개수를 세고자 함.
    • 숫자 자체가 num_list에 있는 경우 : 1개의 숫자가 필요
    • 숫자 자체가 num_list에 없는 경우 → 2개 이상의 수로 조합되는 경우 : 각 숫자들을 만드는 데 사용된 숫자들의 합 개수만큼 필요
      ex) num_list = [1,3]일 때 -> arr[1] = 1, arr[3] = 1
      숫자 2를 만드는 데에는 1+1이 필요. 즉 2개의 숫자가 필요 -> arr[2] = 2
      숫자 4를 만드는 경우의 수는 1+3 혹은 2+2가 필요. -> arr[4] =  min(arr[1]+[3], arr[2]+arr[2], INF)

import sys


def input_func():
    N = int(input())
    num_list = list(map(int, input().split()))
    K = int(input())
    return K, sorted(num_list)


def solution(K, num_list):
    inf = sys.maxsize # min으로 값을 업데이트 하기 때문에 maxsize로 배열 초기화
    arr = [inf for _ in range(num_list[-1] * K + 2)]
    arr[1] = 1

    for i in range(1, num_list[-1]*K + 2):
        if i in num_list:
            arr[i] = 1
        else:
            # 두 가지 이상의 수로x 조합되는 경우
            # -> 조건문의 범위가 i//2 + 1이 된다.
            for j in range(1, i//2 + 1):
                arr[i] = min(arr[i], arr[j] + arr[i-j])
        if arr[i] > K:
            if i%2 == 0:
                name = "holsoon"
            else:
                name = "jjaksoon"
            print(f"{name} win at {i}")
            break



def main():
    K, num_list = input_func()
    solution(K, num_list)


if __name__ == '__main__':
    main()


사용된 알고리즘

다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 너비 우선 탐색

728x90