본문 바로가기
백준(baekjoon)/Python

[백준(baekjoon)/Python]백준(BaekJoon) 27942 : :danceplant: Python

by starfish22 2024. 8. 7.
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

댓글