# 알고리즘/이것이 취업을 위한 코딩 테스트다 with 파이썬
[구현] 상하좌우
커피중독자
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 행렬동안 계속한다.