본문 바로가기
Algorithm/Baekjoon

2240. 자두나무 (Python)

by 원만사 2022. 6. 6.
반응형
 

2240번: 자두나무

자두는 자두를 좋아한다. 그래서 집에 자두나무를 심어두고, 여기서 열리는 자두를 먹고는 한다. 하지만 자두는 키가 작아서 자두를 따먹지는 못하고, 자두가 떨어질 때까지 기다린 다음에 떨어

www.acmicpc.net

 

풀이

 3차원 dp 배열을 이용하여 문제를 해결할 수 있다. 3차원 dp 정보는 다음과 같다.

dp[t][w][p] : t시간에 w번 이동하여 p번 나무에 있을 때 받을 수 있는 자두의 최대 개수

 

 처음에는 1번 자두 나무에 위치하므로 이에 대하여 따로 처리해준다. 만약 처음으로 떨어지는 자두의 위치가 1일 경우에는 이동하지 않고 자두를 받을 수 있으므로 dp[1][0][1]을 1로 설정한다. 

 처음으로 떨어지는 자두의 위치가 2일 경우에는 한 번 이동해야 받을 수 있으므로 dp[1][1][2]를 1로 설정한다.

 

 그 후 두 번째로 떨어지는 자두부터 시작하여 모든 이동 횟수에 대하여 자두를 구해주면 된다. 

    # 첫 번째 자두는 처리했으므로 두 번째 자두부터 처리 
    for t in range(2, T+1):
        tree = trees[t-1] 
        
        for w in range(W+1):
            if tree == 1: # 1번 나무일 경우 
                # 1번에 있을 때: max(t-1에 1번에서 움직이지 않은 경우와 t-1에 2번에서 1번으로 이동한 경우)에 +1을 해준다.
                # 2번에 있을 때: max(t-1에 1번에서 2번으로 이동한 경우와 t-1에 2번에서 움직이지 않은 경우)
                dp[t][w][1] = max(dp[t-1][w][1], dp[t-1][w-1][2]) + 1
                dp[t][w][2] = max(dp[t-1][w-1][1], dp[t-1][w][2])
            else: # 2번 나무일 경우 
                # 1번에 있을 때: max(t-1에 1번에서 움직이지 않은 경우와 t-1에 2번에서 1번으로 이동한 경우)
                # 2번에 있을 때: max(t-1에 1번에서 2번으로 이동한 경우와 t-1에 2번에서 움직이지 않은 경우)에 +1을 해준다.
                dp[t][w][1] = max(dp[t-1][w][1], dp[t-1][w-1][2])
                dp[t][w][2] = max(dp[t-1][w-1][1], dp[t-1][w][2]) + 1

 

 점화식에 대한 설명은 주석을 참고하자.

 

코드

if __name__ == '__main__':
    T, W = map(int, input().split())

    # dp[T][W][위치] : T 시간에 W번 이동했을 때 1번(또는 2번)나무에 있을 때 받을 수 있는 자두의 최대 개수 
    dp = [[[0 for _ in range(3)] for _ in range(W+2)] for _ in range(T+1)]
    trees = [] # 자두가 떨어지는 나무 위치 리스트 

    for _ in range(T):
        trees.append(int(input()))

    # 첫 번째 떨어지는 자두에 대한 처리 
    if trees[0] == 1: # 1번 나무일 경우 한 번도 이동하지 않아도 받을 수 있다.
        dp[1][0][1] = 1
    else: # 2번 나무일 경우 한 번 이동해야 받을 수 있다.
        dp[1][1][2] = 1

    # 첫 번째 자두는 처리했으므로 두 번째 자두부터 처리 
    for t in range(2, T+1):
        tree = trees[t-1] 
        
        for w in range(W+1):
            if tree == 1: # 1번 나무일 경우 
                # 1번에 있을 때: max(t-1에 1번에서 움직이지 않은 경우와 t-1에 2번에서 1번으로 이동한 경우)에 +1을 해준다.
                # 2번에 있을 때: max(t-1에 1번에서 2번으로 이동한 경우와 t-1에 2번에서 움직이지 않은 경우)
                dp[t][w][1] = max(dp[t-1][w][1], dp[t-1][w-1][2]) + 1
                dp[t][w][2] = max(dp[t-1][w-1][1], dp[t-1][w][2])
            else: # 2번 나무일 경우 
                # 1번에 있을 때: max(t-1에 1번에서 움직이지 않은 경우와 t-1에 2번에서 1번으로 이동한 경우)
                # 2번에 있을 때: max(t-1에 1번에서 2번으로 이동한 경우와 t-1에 2번에서 움직이지 않은 경우)에 +1을 해준다.
                dp[t][w][1] = max(dp[t-1][w][1], dp[t-1][w-1][2])
                dp[t][w][2] = max(dp[t-1][w-1][1], dp[t-1][w][2]) + 1

    res = -1
    for w in range(W+1):
        res = max(res, max(dp[T][w][1], dp[T][w][2]))

    print(res)

 

반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

17071. 숨바꼭질 5 (Python)  (0) 2022.06.09
17136. 색종이 붙이기 (Python)  (0) 2022.06.07
2141. 우체국 (Python)  (0) 2022.06.04
10282. 해킹 (Python)  (0) 2022.06.03
1082. 방 번호 (Python)  (0) 2022.06.02

댓글