반응형
해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다.
문제설명
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)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[이코테] 구현 - 왕실의 나이트 (0) | 2021.09.06 |
---|---|
[이코테] 구현 - 시각 (0) | 2021.09.06 |
[이코테] 그리디 - 1이 될 때까지 (0) | 2021.09.06 |
[이코테] 그리디 - 숫자 카드 게임 (0) | 2021.09.06 |
[이코테] 그리디 - 큰 수의 법칙 (0) | 2021.09.06 |