일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 순열
- 안드로이드
- 파이썬
- 1182
- 9095
- expo
- 11057
- 최소공배수
- 코틀린
- lcm
- 6603
- Combination
- permutation
- itertools
- 11기
- 11053
- 11054
- 앱
- Kotlin
- 괄호
- 백준
- Android
- 코테
- 1260
- Python
- 나머지
- 뒤로가기
- 매일11시
- LCS
- 홈화면
Archives
- Today
- Total
황소개발자
백준 12026 파이썬 python : BOJ 거리 @@황소처럼 우직하게@@ 시간초과 포비아 쉣더퍽 본문
반응형
포비아포비아!
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)
반응형
'백준 문제 풀이' 카테고리의 다른 글
백준 12869 파이썬 python : 뮤탈리스크 @@황소처럼 우직하게@@ 능숙하게 짤 짬밥까지 (2) | 2020.04.24 |
---|---|
백준 12996 파이썬 python : Acka @@황소처럼 우직하게@@ dp의 진리이다.. (0) | 2020.04.24 |
백준 14238 파이썬 python : 출근 기록 @@황소처럼 우직하게@@ ㅋㅋ재밋네 (0) | 2020.04.24 |
백준 12969 파이썬 python : ABC @@황소처럼 우직하게@@dp 끝판왕이네 이거.. (0) | 2020.04.24 |
백준 15486 파이썬 python : 퇴사 2 @@황소처럼 우직하게@@ 런타임에러 뜨지? 일로와~ (0) | 2020.04.23 |
Comments