이것이 코딩 테스트다 p.110
[문제 상황]
여행가 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)를 출력하세요.
[입출력 예시]
입력예시 : 5
R R R U D D
출력예시 : 3 4
[풀이]
1. LRUD 이동 설계
# 1) 첨부된 사진을 기반으로 가상의 x축, y축을 설정하고 LRUD 이동을 정리한다
# L = y - 1
# R = y + 1
# U = x - 1
# D = x + 1
# 2) 실시간 x, y 좌표를 기록할 dict를 생성한다(시작 좌표는 (1,1))
move_dict = {'x':1, 'y':1}
# 3) 예시 상황을 기반으로 실제 이동을 설계한다
example = 'R R R U D D'
for e in example.split(' '):
if e == 'L':
move_dict['y'] -= 1
elif e == 'R':
move_dict['y'] += 1
elif e == 'U':
move_dict['x'] -= 1
elif e == 'D':
move_dict['x'] += 1
print(move_dict)
# {'x':2, 'y':4}
2. 이동가능범위 설정
x, y 좌표가 각각 1 이상 N 이하의 범위 내에서만 이동이 가능하다.
move_dict = {'x':1,'y':1}
N_example = 5
example = 'R R R U D D'
for e in example.split(' '):
if (e == 'L') and (move_dict['y'] > 1):
move_dict['y'] -= 1
elif (e == 'R') and (move_dict['y'] < N_example):
move_dict['y'] += 1
elif (e == 'U') and (move_dict['x'] > 1):
move_dict['x'] -= 1
elif (e == 'D') and (move_dict['x'] < N_example):
move_dict['x'] += 1
else: pass
print(move_dict)
# {'x': 3, 'y': 4}
3. 좌표 출력
N_example = 5
move_dict = {'x':1,'y':1}
example = 'R R R U D D'
for e in example.split(' '):
if (e == 'L') and (move_dict['y'] > 1):
move_dict['y'] -= 1
elif (e == 'R') and (move_dict['y'] < N_example):
move_dict['y'] += 1
elif (e == 'U') and (move_dict['x'] > 1):
move_dict['x'] -= 1
elif (e == 'D') and (move_dict['x'] < N_example):
move_dict['x'] += 1
else: pass
print(move_dict['x'],move_dict['y'])
# 3 4
4. 함수화
def solution(N, moves):
move_dict = {'x':1, 'y':1}
for m in moves.split(' '):
if (m == 'L') and (move_dict['y'] > 1):
move_dict['y'] -= 1
elif (m == 'R') and (move_dict['y'] < N):
move_dict['y'] += 1
elif (m == 'U') and (move_dict['x'] > 1):
move_dict['x'] -= 1
elif (m == 'D') and (move_dict['x'] < N):
move_dict['x'] += 1
else: pass
answer = print(move_dict['x'],move_dict['y'])
return answer
solution(5,'R R R U D D')
# 3 4
'ASAC 6기 > 코딩테스트' 카테고리의 다른 글
[정렬] 파일명 정렬 (1) | 2024.08.22 |
---|---|
[정렬] 실패율 (0) | 2024.08.18 |
[구현] 왕실의 나이트 (0) | 2024.08.18 |