#문제링크
https://www.acmicpc.net/problem/27210
27210번: 신을 모시는 사당
칠할 수 있는 돌상의 개수에 제한은 없으며, 반드시 연속한(인접한) 돌상들만 칠할 수 있음(띄엄띄엄 칠할 수 없음)에 유의하라.
www.acmicpc.net
#나의풀이
import sys
if __name__=="__main__":
N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
dp = [[0,0] for _ in range(N)]
answer = 0
if arr[0] == 1:
dp[0][0] = 1
dp[0][1] = -1
else:
dp[0][0] = -1
dp[0][1] = 1
for i in range(1 ,N):
if arr[i] == 1:
dp[i][0] = max(1, dp[i-1][0]+1)
dp[i][1] = max(-1, dp[i-1][1]-1)
else:
dp[i][0] = max(-1, dp[i-1][0]-1)
dp[i][1] = max(1, dp[i-1][1]+1)
for i in dp:
answer = max(answer, max(i))
print(answer)
#해설
처음에 문제를 잘못 이해해서 왼쪽을 보고 있는 석상이 지식을 주고 오른쪽을 보는 석상이 지식을 뺏는줄 알고 풀다가 1시간동안 디버깅을 했다. 알고보니 두 석상을 뺀 절대값중 가장 큰 값을 찾는 문제
N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
dp = [[0,0] for _ in range(N)]
answer = 0
입력 부분으로 dp배열은 2차원으로 했다. [i][0]은 왼쪽을 본 석상의 dp값이 될것이고 [i][1]은 오른쪽을 보고 있는 석상의 dp로 설정했다.
if arr[0] == 1:
dp[0][0] = 1
dp[0][1] = -1
else:
dp[0][0] = -1
dp[0][1] = 1
0번째를 두고 초기값을 설정했다 첫번째수가 1이면 왼쪽dp가 1 오른쪽은 -1 지식을 얻고 있는것이고 반대일경우 반대로 점수를 얻게 된다.
for i in range(1 ,N):
if arr[i] == 1:
dp[i][0] = max(1, dp[i-1][0]+1)
dp[i][1] = max(-1, dp[i-1][1]-1)
else:
dp[i][0] = max(-1, dp[i-1][0]-1)
dp[i][1] = max(1, dp[i-1][1]+1)
이후 2번째 수부터 돌면서 값을 확인한다.
현재값이 왼쪽을 보고 있다고 가정하면 현재부터 색칠한다고 하면 1점을 얻을수 있어 기본값이 1이고 이전 값과 연결한다면 dp[이전인덱스]값에 +1을 해준값이 된다. 이후 기본값과 연결된값을 비교해서 큰 값으로 설정한다.
for i in dp:
answer = max(answer, max(i))
print(answer)
반복문을 돌면서 가장 큰 값을 찾고 출력한다.