문제 상황
여행가 A는 N by N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 by 1크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N, N)이다. A의 이동 가능성은 L(왼쪽으로 1칸 이동), R(오른쪽으로 1칸 이동), U(위쪽으로 1칸 이동), D(아래쪽으로 1칸 이동) 이렇게 4가지 방향만 이동이 가능함. 시작 좌표는 항상 (1,1)이며, N by N의 공간을 벗어나게 된다면, 그 움직임은 무시가 된다. 예: (1,1)에 있는데, U이 나오면 움직임을 하지 않고 무시한다.
예시 상황
R - R -R - U - D -D가 주어지면, (1,1)에서 이 A가 움직인다면, (1,1) → (1,2) → (1,3) → (1,4) → (1,4) → (2,4) → (3,4)로 최종 도착지는 (3, 4)가 된다.
입출력 조건
입력 조건
- 첫재 줄에 공간의 크기를 나타내는 N이 주어진다. ( 1 ≤ N ≤ 100)
- 둘째 줄에 A가 이동할 계획서 내용이 주어진다. (단, 1 ≤ 이동횟수 ≤ 100)
출력 조건
- A의 최종적인 도착지점의 좌표(X, Y)를 출력하세요. 단, 공백으로 구분된 X Y 의 형식일 것
입출력 예시
입력예시 : 5
R R R U D D
출력예시 : 3 4
아이디어
1. 지도의 크기를 input을 통해 입력 받고 입력받은 문자열을 정수형으로 형변환
2. 이동에 대한 상, 하, 좌, 우 이동에 대한 부분을 좌표로 표현하기
3. 범위를 벗어나는 경우와 벗어나지 않는 경우의 처리를 구분
구현
CASE1
N = int(input('지도의 크기를 입력하세요'))
move_plan = (input('이동 계획을 공백으로 구분하여 L R U D 중에 입력하세요.').split(' '))
move_dict = {
'L':(0, -1), 'R':(0, 1), 'U':(-1, 0), 'D':(1, 0)
}
x, y = 1, 1
for plan in move_plan:
if 1 <= x + move_dict[plan][0] <= N and 1 <= y + move_dict[plan][1] <= N:
x += move_dict[plan][0]
y += move_dict[plan][1]
print(x, y)
CASE2
N = int(input('지도의 크기를 입력하세요'))
move_plan = (input('이동 계획을 공백으로 구분하여 L R U D 중에 입력하세요.').split(' '))
move_list = ['L', 'R', 'U', 'D']
dx = [ 0, 0, -1, 1 ]
dy = [-1, 1, 0, 0 ]
x, y = 1, 1
for plan in move_plan:
for i in range(4):
if plan == move_list[i]:
next_x, next_y = x + dx[i], y + dy[i]
if next_x < 1 or next_x > N or next_y < 1 or next_y > N:
continue
else:
x, y = next_x, next_y
print(x, y)
CASE1 에서는 딕셔너리를, CASE2 에서는 리스트를 이용하여 상하좌우의 움직임을 나타냈다. 주의해야 할 점은 우리가 일반적으로 생각하는 상하좌우의 움직임이 아니라 예시를 통해 확인된 방향을 기준으로 좌표를 설정해야 한다는 것이다. R(오른쪽) 이동이라고 하면 x 좌표가 +1의 이동을 하는 것으로 생각되는 것이 일반적이지만 예시를 보면 R이 주어졌을때 1, 1에서 1, 2 이동한 것을 확인할 수 있다. 파이썬에서는 row를 기준으로 데이터를 묶기 때문에 코딩 테스트 문제를 풀다보면 이런 상황을 종종 겪게 된다. 물론 행을 나타내는 위치를 y 좌표로 설정하는 것도 방법이다.
또한 input으로 입력을 받을 때 split을 함께 사용하는 경우를 자주 볼 수 있는데 split은 괄호 안에 입력한 문자를 기준으로 문자열을 분할해주는 기능을 한다.
문제 출처 : 이것이 코딩테스트다
'Python > 코딩테스트' 카테고리의 다른 글
[2018 카카오 블라인드 채용] 파일명 정렬 (0) | 2024.04.08 |
---|---|
[이것이 코딩 테스트다] 왕실의 나이트 (0) | 2024.04.08 |
[2019 카카오 블라인드 채용] 실패율 (0) | 2024.04.03 |
[카카오 인턴] 키패드 누르기 (0) | 2024.04.03 |
[프로그래머스] 완주하지 못한 선수 (2) | 2024.04.03 |