일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 프론트엔드
- 이더리움
- AWS
- 리액트
- 쿠버네티스
- 알고리즘
- 가상화
- docker
- BFS
- 백엔드
- kubernetes
- next.js
- k8s
- es6
- TypeScript
- 자바스크립트
- CSS
- 파이썬
- 타입스크립트
- JavaScript
- 블록체인
- HTML
- 이슈
- node.js
- 컴퓨터공학
- react
- 클라우드
- 백준
- 솔리디티
- 웹
Archives
- Today
- Total
즐겁게, 코드
BOJ 1912번 - 연속합 본문
[백준 온라인 저지 - 문제 링크]
이 문제에는 시간 초과라는 무시무시한 함정이 깔려 있습니다.
따라서 여느 DP 문제처럼 DP 테이블을 그려 해결하되, 테이블을 조금 더 창의적으로 고안해야만 합니다!
처음 제가 구상한 알고리즘은 증가하는 인덱스 i ~ N까지의 원소 중 최댓값을 각 i 별로 구한 후, 이 중에서 최댓값을 찾는 방법이었습니다.
이를 기반으로 거친 생각과 불안한 마음을 안고 코드를 짜 봤으나...
[실패 코드 (Python)]
# 시간 초과 코드
T = int(input())
d = [0] * 100001
arr = list(map(int, input().split()))
ans_list = []
temp_list = []
d[0] = arr[0]
for i in range(1, T):
temp_list.append(arr[0])
for j in range(i, T):
d[j] = d[j - 1] + arr[j]
temp_list.append(d[j])
ans_list.append(max(temp_list))
d = [0] * 100001
temp_list = []
print(max(ans_list))
이 방법은 로컬 환경에서는 제대로 동작하지만 아쉽게도 채점 환경에서는 테스트 케이스의 범위로 인해 시간 초과에 걸리게 됩니다.
따라서 위 알고리즘을 개선해야만 하는데요, 이중 for문을 돌린 이유가 연속합을 시작하는 지점을 구하기 위한 것이라는 점을 생각해 봅시다.
이걸 어떻게 설명해야 할지 잘 몰라 그림을 그려서 준비했는데요, 이렇게 하면 연속합을 시작하는 지점을 한 번의 반복문만으로도 구할 수 있습니다!
[정답 코드 - Python]
T = int(input())
num_list = list(map(int, input().split()))
d = [0] * 100001
ans = -1001
for i in range(T):
d[i] = max(num_list[i], d[i - 1] + num_list[i])
ans = max(d[i], ans)
print(ans)
개인적으로는 실버 1을 배정받은 RGB 거리보다도 더 어려웠던 문제라고 생각합니다.
잊지 마세요, 결국 DP 문제는 DP 테이블을 어떻게 창의적으로 구상하느냐의 싸움이랍니다!
(이상 10문제 풀어본 후기)
반응형
'💯 알고리즘 > 백준 온라인 저지' 카테고리의 다른 글
BOJ 2178번 - 미로 탐색 (0) | 2021.04.02 |
---|---|
BOJ 2667번 - 단지번호붙이기 (1) | 2021.03.29 |
BOJ 1012번: 유기농 배추 (0) | 2021.03.13 |
BOJ 1932번 - 정수 삼각형 (1) | 2021.03.10 |
BOJ 15624번 - 피보나치 수 7 (0) | 2021.03.08 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆