728x90
▶문제 : 27942번: :danceplant: (acmicpc.net)
▶코드작성
N=int(input())
area=[]
for _ in range(N):
area.append(list(map(int, input().split())))
dx=[N//2-1, N//2] #가지 위치 [왼쪽, 오른쪽]
dy=[N//2-1, N//2] #[위쪽, 아래쪽]
sum=0
text=''
left=area[dy[0]][dx[0]-1]+area[dy[1]][dx[0]-1]
right=area[dy[0]][dx[1]+1]+area[dy[1]][dx[1]+1]
up=area[dy[0]-1][dx[0]]+area[dy[0]-1][dx[1]]
down=area[dy[1]+1][dx[0]]+area[dy[1]+1][dx[1]]
values=[up, down, left, right] #상하좌우 값 초기화
while True:
m=max(values)
if m<=0: #모든 방향의 값이 0이하일 때 종료
break
sum+=m
idx=values.index(m) #가장 큰 값의 상하좌우 위치 찾기
values[idx]=0 #늘어난 부분의 한줄 합을 초기화해주기 위해 0삽입
if idx==0:#상
text+='U'
dy[0]-=1
if dy[0]>0: #끝까지 가지 않았을 때
for i in range(dx[0], dx[1]+1): #한줄의 합 구하기
values[idx]+=area[dy[0]-1][i]
if dx[0]>0: #끝까지 가지 않았을 때
values[2]+=area[dy[0]][dx[0]-1] #좌측의 기존 합에 추가
if dx[1]<N-1: #끝까지 가지 않았을 때
values[3]+=area[dy[0]][dx[1]+1] #우측의 기존 합에 추가
elif idx==1:#하
text+='D'
dy[1]+=1
if dy[1]<N-1:
for i in range(dx[0], dx[1]+1):
values[idx]+=area[dy[1]+1][i]
if dx[0]>0:
values[2]+=area[dy[1]][dx[0]-1]
if dx[1]<N-1:
values[3]+=area[dy[1]][dx[1]+1]
elif idx==2:#좌
text+='L'
dx[0]-=1
if dx[0]>0:
for i in range(dy[0], dy[1]+1):
values[idx]+=area[i][dx[0]-1]
if dy[0]>0:
values[0]+=area[dy[0]-1][dx[0]]
if dy[1]<N-1:
values[1]+=area[dy[1]+1][dx[0]]
elif idx==3:#우
text+='R'
dx[1]+=1
if dx[1]<N-1:
for i in range(dy[0], dy[1]+1):
values[idx]+=area[i][dx[1]+1]
if dy[0]>0:
values[0]+=area[dy[0]-1][dx[1]]
if dy[1]<N-1:
values[1]+=area[dy[1]+1][dx[1]]
print(sum)
print(text)
▶해석
dx, dy를 사용해 가지의 왼쪽, 오른쪽, 위쪽, 아래쪽 위치를 알 수 있도록 하였다.
가지의 상하좌우의 값들을 먼저 계산하여 values 배열에 초기화하였다.
values배열의 최댓값과 그 최댓값의 위치(상하좌우)를 알아내어 해당 방향으로 움직이도록 했다.
가지가 어느 방향으로 움직일 때 해당 방향의 values 값을 0으로 초기화하고, 다시 for문으로 한줄의 합을 계산하였다. 또한 한쪽이 늘어나면 인접한 두쪽이 한칸씩 늘어나므로 기존 values값에 각각 추가해주었다.
예를 들면, 가지가 위쪽(상)으로 움직였을 때 왼쪽(좌), 오른쪽(우)이 각각 한칸씩 생겨서 추가해주어야 하므로 values 위치에 맞게 더해주었다.
728x90
댓글