본문 바로가기

알고리즘 삽질장

[이코테] 구현 - 상하좌우

반응형

해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다. 

 


문제설명

N by N 크기의 정사각형 공간 위에서 가장 왼쪽 위 좌표는 (1, 1)이고 가장 오른쪽 아래 좌표는 (N, N)이다. 상, 하, 좌, 우로만 이동할 수 있으며 시작 좌표는 항상 (1, 1)이다. 이동 계획이 문자열로 주어질 때 최종 위치는 어디인지 출력하라.

  • L : 왼쪽으로 한 칸 이동 -> 열 방향으로 -1
  • R : 오른쪽으로 한 칸 이동 -> 열 방향으로 +1
  • U : 위로 한 칸 이동 -> 행 방향으로 -1
  • D : 아래로 한 칸 이동 -> 행 방향으로 +1

입력조건

  • 첫째 줄에 공간의 크기를 나타내는 N이 주어진다(1 <= N <= 100)
  • 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다(1 <= 이동 횟수 <= 100)

출력조건

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

사고과정

  • 예전에 풀어본 경험이 문득 생각나서 방향에 따라 X, y 좌표를 더해주는 아이디어가 생각남
  • 처음엔 N by N 사이즈의 배열을 만들었는데, 나중에는 이걸 활용할 필요 없었음 -> 오히려 이것으로 혼란이 올 뻔함 -> 이것 때문에 시작 좌표가 (1, 1)이라는데, 배열 인덱스 시작은 (0, 0) 인데 어떻게 +1 해줄까... 오히려 불필요한 고민이 더 생김
  • 이동 계획 문자열을 key로 하고 이동 좌표를 value로 하는 딕셔너리를 활용해보자 생각함

풀이

1. 나의 풀이

N = int(input())
plans = input().split()

directions = {'L': (0, -1), 'R': (0, 1), 'U': (-1, 0), 'D': (1, 0)}
x, y = 1, 1

for plan in plans:
    x_plan, y_plan = directions[plan]
    x_new = x + x_plan
    y_new = y + y_plan
    if x_new < 1 or x_new > N or y_new < 1 or y_new > N:
        continue
    x, y = x_new, y_new

print(x, y)

2. 책의 풀이

책에서는 딕셔너리가 아닌 리스트를 활용함

N = int(input())
plans = input().split()

dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
directions = ['L', 'R', 'U', 'D']
x, y = 1, 1

for plan in plans:
    # 계획에 맞는 이동 좌표 설정
    for i in range(len(directions)):
        if plan == directions[i]:
            nx = x + dx[i]
            ny = y + dy[i]
    # 구간 넘어가면 무시
    if nx < 1 or nx > N or ny < 1 or ny > N:
        continue
    # 구간 범위 안이면 위치 업데이트
    x, y = nx, ny

print(x, y)
반응형