본문 바로가기
문제 해결/BOJ

[백준] 돌다리 건너기

by 자잘 2023. 5. 11.

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

 

2602번: 돌다리 건너기

첫째 줄에는 마법의 두루마리에 적힌 문자열(R, I, N, G, S 로만 구성된)이 주어진다. 이 문자열의 길이는 최소 1, 최대 20 이다. 그 다음 줄에는 각각 <악마의 돌다리>와 <천사의 돌다리>를 나타내는

www.acmicpc.net

 

1. 문제이해

마법의 두루마리에 적혀있는 단어의 문자순서대로 악마의 돌다리와 천사의 돌다리를 번갈아가면서 밟을 수 있는 모든 경우의 수를 구하는 문제입니다.

2. 문제접근

접근 방식: DP

제일 못하는 재귀 DP입니다. DP[k][i][j]라고 정의했을때 k = 0인 경우는 천사의 돌다리를 건널 차례일 때 마법의 두루마리의 i번째 문자를 돌다리에서 j인덱스부터 찾는 경우를 의미합니다. 재귀를 돌면서 돌다리를 넘어다니면서 dp 배열을 채워나가면 답을 구할 수 있습니다.

3. 풀이

import sys

sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

order = input().rstrip()
angel = input().rstrip()
devil = input().rstrip()

len_of_order = len(order)
len_of_bridge = len(angel)

dp = [
    [[-1] * len_of_bridge
    for _ in range(len_of_order)]
    for __ in range(2)
]

def dfs(idx, find, start):
    # 두루마리에 있는 모든 문자를 찾은 경우
    if find == len_of_order:
        return 1

    # 범위를 넘어가는 경우
    if start >= len_of_bridge:
        return 0

    # 이미 계산이 되어있는 경우
    if dp[idx][find][start] > -1:
        return dp[idx][find][start]

    total = 0

    # 천사의 돌다리를 건널 차례인 경우
    if idx == 0:
        for i in range(start, len_of_bridge):
            # 현재 찾고자하는 문자와 천사의 돌다리 문자가 같은 경우
            if order[find] == angel[i]:
                total += dfs(1, find + 1, i + 1)
    # 악마의 돌다리를 건널 차례인 경우
    else:
        for i in range(start, len_of_bridge):
            if order[find] == devil[i]:
                total += dfs(0, find + 1, i + 1)

    dp[idx][find][start] = total
    return total


print(dfs(0, 0, 0) + dfs(1, 0, 0))

4. 회고

점화식을 찾는데 꽤 애를 먹었습니다. 재귀 DP는 범위내에서의 최대, 최소값을 위해서만 사용해봤는데 이 문제는 이동하면서 dp를 계산해야하는 문제여서 신선했습니다.

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 연속합 2  (0) 2023.09.09
[백준] 창업  (0) 2023.06.18
[백준] 스위치  (0) 2023.05.03
[백준] 배열 돌리기 4  (0) 2023.05.02
[백준] 소용돌이 예쁘게 출력하기  (0) 2023.05.01