Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 일상
- 타입스크립트
- react-redux
- Operating System
- Spring
- Java
- codeup
- 백준
- CPU 스케줄링
- 협업
- 프로그래머스
- C++
- web
- 코드업
- 기초100제
- 토이프로젝트
- memory
- 파이썬
- 알고리즘
- js to ts
- OS
- 공부
- 리덕스장바구니
- 분할메모리할당
- error
- Redux
- 정렬
- 자료구조
- 스프링
- react
Archives
- Today
- Total
감자튀김 공장🍟
[백준/9184] 신나는 함수 실행 (with 파이썬) 본문
반응형
✔ 문제
✔ 풀이
👽 시간 초과 - 재귀함수
import sys
input = sys.stdin.readline
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
return 1
elif a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
elif a < b < c:
return w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
else:
return w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1:
break
res = w(a, b, c)
print("w({}, {}, {}) = {}".format(a, b, c, res))
🌱 시간초과 - dp
import sys
input = sys.stdin.readline
MAX = 21
dp = [[[0] * MAX for _ in range(MAX)] for _ in range(MAX)]
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if a < b < c:
dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[a][b][c]
else:
dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
return dp[a][b][c]
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1:
break
res = w(a, b, c)
print("w({}, {}, {}) = {}".format(a, b, c, res))
MAX = 21인 이유
1,2번째 if문 조건을 보면 a,b,c의 범위가 0~19까지임을 알 수 있음
💚 dp 풀이2
import sys
input = sys.stdin.readline
MAX = 21
dp = [[[0] * MAX for _ in range(MAX)] for _ in range(MAX)]
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if dp[a][b][c]: #추가
return dp[a][b][c]
if a < b < c:
dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[a][b][c]
else:
dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
return dp[a][b][c]
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1:
break
print("w({}, {}, {}) = {}".format(a, b, c, w(a, b, c)))
✔ 후기
문제에 재귀로 나와있길래 재귀로 풀었다가 역시나 시간초과로 실패,
dp로 풀어보는데 MAX 범위 잡느라 잠깐 멈칫한 상태로 고민하고 풀었지만 시간초과로 실패
도저히 모르겠어서 구글링했더니 if문을 하나 추가하니까 엄청 빠르게 문제가 풀렸다.
해당 조건문은 dp[a][b][c]의 값이 존재한다면 (0이면 다른 if문에 걸렸을테니) dp[a][b][c] 값을 그대로 리턴하라는 문장이다.
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[백준/9461] 파도반 수열 (with 파이썬) (0) | 2023.02.09 |
---|---|
[백준/1904] 01타일 (with 파이썬) (0) | 2023.02.08 |
[백준/24416] 알고리즘 수업 - 피보나치 수 1 (with 파이썬) (0) | 2023.02.06 |
[백준/14889] 스타크와 링크 (with 파이썬) (0) | 2023.02.05 |
[백준/14888] 연산자 끼워넣기 (with 파이썬) (0) | 2023.01.04 |
Comments