본문 바로가기
I can do it on my own!/우당탕탕

[이코테] 14강 문제 '상하좌우'

by zivvon 2023. 5. 18.
목차 접기

문제

여행가 A는 N x N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당합니다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있습니다.

 

계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나의 문자가 반복적으로 적혀 있습니다. 각 문자의 의미는 다음과 같습니다.

 

L : 왼쪽으로 한 칸 이동

R : 오른쪽으로 한 칸 이동

U : 위로 한 칸 이동

D : 아래로 한 칸 이동

 

이때 여행가 A가 N x N 크기의 정사각형 공간을 벗어나는 움직임은 무시됩니다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시됩니다. 다음은 N = 5인 지도와 계획서입니다.

 

문제 조건

풀이 시간 15분, 시간 제한 2초, 메모리 제한 128MB

 

입력

첫째 줄에 공간의 크기를 나타내는 N이 주어집니다.

둘째 줄에 여행가 A가 이동할 계획서 내용이 주어집니다.

 

출력

첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X, Y)를 공백을 기준으로 구분하여 출력합니다.


'정답 코드'

n = int(input())
x, y = 1, 1 # 시작점
plans = input().split()

# 이동 방향 L, R, U, D
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']

# 이동 계획 확인
for plan in plans:
  # 다음 좌표
  for i in range(len(move_types)):
    if plan == move_types[i]:
      nx = x + dx[i]
      ny = y + dy[i]

  # 공간 벗어나면 무시
  if nx < 1 or ny < 1 or nx > n or ny > n:
    continue

  # 이동
  x, y = nx, ny

print(x, y)

행렬과 방향 벡터 구현에 생각보다 애를 먹었다. 아마 파이썬 로직은 처음이라 그러겠지?

라고 믿는 게 내 정신 건강에 좋을 것 같다.

 

2차원 공간 만드는 법과 방향 벡터 구현 로직을 머릿 속에 잘 저장해뒀다가 응용하자!

 

'공부한 것'

- continue문 : 반복문 전체를 빠져나오는 것이 아닌 해당 조건만 건너뛰고 싶을 때 사용