백준 21758 파이썬 코드
- CS/BOJ
- 2021. 10. 4.
import sys
n = int(sys.stdin.readline().rstrip())
my_list = list(map(int, sys.stdin.readline().split()))
s = [0 for _ in range(n + 1)]
for i in range(1, n + 1):
s[i] = s[i - 1] + my_list[i - 1]
answer = 0
for k in range(2, n):
temp = (s[k] - s[1]) + (s[-2] - s[k - 1])
answer = max(answer, temp)
for k in range(2, n):
temp = (s[-2] - s[k]) + 2 * (s[k - 1] - s[0])
answer = max(answer, temp)
for k in range(2, n):
temp = (s[k - 1] - s[1] + 2 * (s[-1] - s[k]))
answer = max(answer, temp)
print(answer)
회고
처음에는 누적합 + 투 포인터 개념으로 접근을 해보려고 했었다. 그런데 투 포인터로 접근했을 때, 어떤 결과에 대한 방향성 설정을 할 수 없다는 것을 깨달았다. 즉, 투 포인터로 접근이 안되고 브루트포스로 접근해야하는데 이 경우에는 O(N^2)으로 TLE가 발생할 수 밖에 없다는 것을 알았다.
따라서, 시간 복잡도를 O(N) 수준으로 줄여야 하는데 가능한 방법은 그리디 알고리즘 밖에 없어보였다. 또한, 그리디 알고리즘을 세 가지 경우를 나눠서 적용해야 하는 것으로 분류했다.
꿀<벌벌, 벌>꿀<벌, 벌벌<꿀 인 경우가 있을 것이다. 이 세가지 경우에 대해서 그리디 알고리즘을 적용했다. 당연한 얘기지만 벌들이 이동할 수 있는 거리는 항상 큰 것이 좋다. 즉, 꿀<벌벌일 경우 꿀과 벌 하나의 좌표는 고정된다. 그리고 나머지 벌 한 마리가 어디에 위치하면 좋을지에 대해 선형적으로 탐색했다.
세 가지 경우에 대해서 선형 탐색으로 했으므로 시간 복잡도는 O(3*N)으로 확인되었다.
추가적으로 필요한 부분
누적합을 할 때는 계산의 편의성을 위해 0번 배열을 하나 추가한 후, 누적합을 구해주는 것이 좋다.
'CS > BOJ' 카테고리의 다른 글
백준 12892 파이썬 문제 (0) | 2022.02.14 |
---|---|
백준 2435 파이썬 코드 (0) | 2021.10.04 |
백준 2842 파이썬 문제풀이 (0) | 2021.09.16 |
프로그래머스 블록 이동하기 파이썬 (0) | 2021.09.13 |
프로그래머스 괄호 변환 파이썬 (0) | 2021.09.13 |