황소개발자

백준 12026 파이썬 python : BOJ 거리 @@황소처럼 우직하게@@ 시간초과 포비아 쉣더퍽 본문

백준 문제 풀이

백준 12026 파이썬 python : BOJ 거리 @@황소처럼 우직하게@@ 시간초과 포비아 쉣더퍽

hjp845 2020. 4. 24. 03:06
반응형

포비아포비아!

n = int(input())
lst = input()

ans = 999999999
def go(idx, cost):
    global ans
    if idx == n - 1:
        ans = min(ans, cost)
        return
    now = lst[idx]
    if now == 'B':
        for i in range(idx + 1, n):
            if lst[i] == 'O':
                go(i, cost + pow(i - idx, 2))
    elif now == 'O':
        for i in range(idx + 1, n):
            if lst[i] == 'J':
                go(i, cost + pow(i - idx, 2))
    elif now == 'J':
        for i in range(idx + 1, n):
            if lst[i] == 'B':
                go(i, cost + pow(i - idx, 2))
go(0, 0)
print(ans if ans != 999999999 else -1)

위와 같이 짜면 시간초과.

재귀에 이어서 또 엄청난 재귀가 이어지지..

특정 인덱스에 가는 방법이 매우 여러가지야

반면, 아래와 같은 반복문은 간단하지

n * n 의 시간복잡도 1,000,000 작은 숫자지.

n = int(input())
lst = input()

MAX = 999999999
dp = [MAX] * n

def get_prev(x):
    if x == "B":
        return "J"
    elif x == "O":
        return "B"
    elif x == "J":
        return "O"

dp[0] = 0
for i in range(1, n):
    prev = get_prev(lst[i])
    for j in range(i):
        if lst[j] == prev:
            dp[i] = min(dp[i], dp[j] + pow(i - j, 2))
print(dp[n - 1] if dp[n - 1] != MAX else -1)
반응형
Comments