개발/문제풀이
[BOJ 27210, Python] 신을 모시는 사당 풀이
Junhyung-Choi
2023. 2. 1. 18:04
반응형
import sys
input = sys.stdin.readline
s_num = int(input())
s_list = list(map(int,input().split()))
m_list = []
before_s = s_list[0]
count = 0
if before_s == 1:
count += 1
else:
count -= 1
for i in range(1,s_num):
if s_list[i] != before_s:
before_s = s_list[i]
m_list.append(count)
count = 0
if before_s == 1:
count += 1
else:
count -= 1
else:
if s_list[i] == 1:
count += 1
else:
count -= 1
m_list.append(count)
# print(m_list)
max_val = 0
min_val = 0
stack = 0
for statue in m_list:
if(statue > 0):
current_sum = max_val + stack + statue
# 본인 값이 다 더한거보다 큰 경우
if(statue >= current_sum):
max_val = statue
stack = 0
# 이전 최댓값에 본인을 더하면(음수 포함해서) 더 커지는 경우
elif (current_sum >= max_val):
max_val = current_sum
stack = 0
# 최댓값보단 본인이 큰 경우
elif (statue >= max_val):
max_val = statue
stack = 0
else:
stack += statue
else:
stack += statue
stack = 0
for statue in m_list:
if(statue < 0):
current_sum = min_val + stack + statue
# 본인 값이 다 더한거보다 큰 경우
if(statue <= current_sum):
min_val = statue
stack = 0
# 이전 최댓값에 본인을 더하면(양수 포함해서) 더 작아지는 경우
if (current_sum <= min_val):
min_val = current_sum
stack = 0
# 최솟값보단 본인이 더 작은 경우
elif (statue <= min_val):
min_val = statue
stack = 0
else:
stack += statue
else:
stack += statue
print(max(max_val,abs(min_val)))
사실 풀어놓고 코드 리뷰를 해도 어떻게 통과한건지 잘 모르겠는 코드이다.
우선 접근 방법은
1. 우선 수를 묶는다.
2. 묶은 수들로 매번 합을 비교해가며 가장 크게 나올 수 있는 합을 찾아간다
3. 가장 작게 나올 수 있는 합 또한 구한다.
4. 그 중 절댓값이 큰 값을 고르자
이런 방식으로 접근했는데
2번 과정을 어떻게 통과한건지 잘 모르겠다.
추후에 업데이트 예정!
728x90