커피중독자 2022. 8. 1. 01:51

[문제]

- N을 입력받는다. N은 N x N 의 맵을 만든다.

- L, R, U, D 를 입력받는다. LEFT / RIGHT / UP / DOWN 을 의미한다.

- 입력받은 LRUD 만큼 (1, 1) 위치에서 이동했을때 어느 좌표에 위치하는지 구현하는 프로그램을 작성한다.

-  N x N 을 벗어나는 LRUD 는 무시된다.

 

[코드]

N=5
x,y,nx,ny = 1,1,0,0
plan = ['R', 'R', 'R', 'U', 'D', 'D']

# 이동을 위한 LRUD 정의
# L 은 (2,2) > (2,1), dx+0 dy-1
# R 은 (2,2) > (2,3), dx+0 dy+1
# U 는 (2,2) > (1,2), dx-1 dy+0
# D 는 (2,2) > (3,2), dx+1 dy+0
move = ['L', 'R', 'U', 'D']
dx = [ 0, 0, -1, 1]
dy = [-1, 1,  0, 0]

for i in plan:
  # i 번쨰 plan 에 해당하는 move를 찾고, 그 move 대로 이동한다. 
  for j in range(len(move)):
    if(i == move[j]):
      # 이동시 위치하게될 nx와 ny를 일단 정해본다.
      nx = x + dx[j]
      ny = y + dy[j]

    # 이동시 위치한곳이 맵을 벗어났다면, 반복구로 돌아간다.
    if (nx<1 or nx>N or ny<1 or ny>N):
      continue

    # 이동시 위치한곳이 이상없다면, 현위치를 nx와 ny로 이동
    x = nx
    y = ny

print(x, y)

 

[아이디어]

- 핵심은 키보드의 방향키역할을하는 이동키 LRUD 를 시뮬레이션 하는것이었다.

- dx 와 dy 정의가 어려웠는데, 이건 실제로 (2,2) 라는 기본위치를 가정하고 LRUD 를 했을때 어느 좌표로 가야하는지 표본을 만들고나니 쉽게 만들어졌다.

 

for j in range(len(move)):
    if(i == move[j]):
      # 이동시 위치하게될 nx와 ny를 일단 정해본다.
      nx = x + dx[j]
      ny = y + dy[j]

 

- 구현이 난해했던 부분이다. 문제에서 주어진 LRUD (i) 를 어떤식으로 탐색하는지가 관건이었다.

- 일단 i 를 기존에 정의해두었던 이동키 LRUD 를 담은 move 행렬의 어떤 index 에 해당하는지를 파악하고, 해당 index 로 dx, dy 를 더해주어서 가상의공간 nx, ny 로 이동시켜준다.

- nx 와 ny 가 맵을 벗어나는 위치가 아니라면, x 와 y 현재위치로 이동시켜주면 된다.

- 위 행위는 문제해서 주어지는 plan 행렬동안 계속한다.