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 |
| 31 |
Tags
- 알고리즘
- til
- 코딩테스트준비
- DP
- 코테 파이썬
- 개발자취업
- ML
- c++ 코테
- 코딩테스트
- 플러터
- 파이썬 코테
- Python
- vue
- 파이썬
- Flutter
- 99클럽
- 코테
- 코딩테스트 준비
- flutter getx
- 백준
- 티스토리챌린지
- 뷰
- C++
- 오블완
- 항해99
- 개발자 취업
- Laravel
- react
- 안드로이드
- 라라벨
Archives
- Today
- Total
잡다로그
[Python/코테] 백준 21735 눈덩이 굴리기 본문
21735 눈덩이 굴리기

알고리즘 설계
💡idea.
많은 경우의 수를 고려해서 합이 최대가 되는 경우를 구해야 하는데, 입력값이 제한을 넘지 않으므로 백트래킹을 사용한다.
🎲step.
1. 함수
백트래킹을 사용할 것이므로, 함수의 실행마다(즉 경우의 수마다) 총합을 구해준다.
최종적으로 가장 큰 값을 결과로 출력할 것이다.
snowball(t, i, value) #남은 시간 t, 이동한 현재 위치 i, 현재까지의 총합 value
2. Base condition
남은 시간이 0이거나 현재 위치가 끝일 때
t == 0 or i ==n
3. 재귀
합을 수행하고, 현재 위치에서 1번과 2번 이동 방법을 실행한다.
if type == 1:
앞 1칸과 2칸의 요소 값의 비교 없이 연산이 끝나고 비교하는 이유는, 현재 위치에서 비교하면 결국 최대 값을 못 구할 수도 있기 때문이다. 끝 요소의 값이 큰데, 끝 요소에 도달하기 전에 당장의 큰 값만 찾다 시간이 종료되어 덧셈이 끝날 수도 있기 때문.
알고리즘 구현
import sys
n, m = map(int, input().split())
yard = list(map(int, sys.stdin.readline().split()))
yard.insert(0, 0)
size = 1
def snowball(t, i, value):
global size
value += yard[i]
if t == 0: # 종료할 때가 되면, 최종 결과를 비교한다.
# 어딘가에서 실행된 snowball함수가 더 큰 value값을 가지면 전역변수 size는 대체된다. -> 결국 모든 경우를 계산하고, 비교하는 셈이다.
size = max(size, value)
return
if i == n: # 시간이 다 되지 않아도, 위치가 끝나면 종료
size = max(size, value)
return
if i+1 <= n:
snowball(t-1, i+1, value)
if i+2 <= n:
snowball(t-1, i+2, value//2)
snowball(m, 0, 1)
print(size)
출처: https://phanre.tistory.com/12
나다어
- 백트래킹이란, 모든 경우의 수를 고려하는 것을 말한다. 가장 효율적인 방법보다, DFS를 기반으로 조건에 맞는지 확인해가며 전체를 순회하려는 목적임을 잊지 말자.
'Algorithm' 카테고리의 다른 글
| [Python/코테] 백준 2239 스도쿠 (0) | 2023.11.21 |
|---|---|
| [Python/코테] 백준 17829 222-풀링 (0) | 2023.11.20 |
| [C++/코테] 백트래킹: 백준 15649, 9663, 1182 (0) | 2023.11.20 |
| [C++/코테] 재귀 (0) | 2023.11.19 |
| [Python/코테] 백준 1629 곱셈 (0) | 2023.11.19 |
Comments