여행가 A는 N x N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당한다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)이다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있다.
| (1, 1) | . | . | . | . |
|---|---|---|---|---|
| . | . | . | . | . |
| . | . | . | . | . |
| . | . | . | . | . |
| . | . | . | . | (N, N) |
계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다. 각 문자의 의미는 다음과 같다.
이때 여행가 A가 N x N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다. 다음은 N = 5인 지도와 계획서이다.
이 경우 6개의 명령에 따라서 여행가가 움직이게 되는 위치는 순서대로 (1, 2), (1, 3), (1, 4), (1, 4), (2, 4), (3, 4)이므로, 최종적으로 여행가 A가 도착하게 되는 곳의 좌표는 (3, 4)이다. 다시 말해 3행 4열의 위치에 해당하므로 (3, 4)라고 적는다. 계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.
5
R R R U D D
3 4
- moves 길이만큼 반복문 돌리기
- 이동 방향에 맞게 x좌표와 y좌표 조정하기
- 이동했을 때 x, y좌표가 칸을 벗어나면 뛰어넘기
n = int(input())
moves = input().split()
x, y = 1, 1
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
for move in moves:
if move == 'L':
if x + dx[0] < 1 or y + dy[0] < 1 or x + dx[0] > n or y + dy[0] > n:
continue
x += dx[0]
y += dy[0]
if move == 'R':
if x + dx[1] < 1 or y + dy[1] < 1 or x + dx[1] > n or y + dy[1] > n:
continue
x += dx[1]
y += dy[1]
if move == 'U':
if x + dx[2] < 1 or y + dy[2] < 1 or x + dx[2] > n or y + dy[2] > n:
continue
x += dx[2]
y += dy[2]
if move == 'D':
if x + dx[3] < 1 or y + dy[3] < 1 or x + dx[3] > n or y + dy[3] > n:
continue
x += dx[3]
y += dy[3]
print(x, y)
처음에 이렇게 작성했는데, 굉장히 깔끔하지 못하죠 ... ㅜㅜ
똑같은 코드를 4번 반복하는 ..
저는 일단 문제 읽고 떠오르는 아이디어대로 코드를 작성하고 봅니당.
그리고나서 반복되는 부분 없애고 줄이는 식으로 코드를 다시 작성해봐욥.
처음부터 잘 작성하면 좋겠지만, 아직 저는 그 정도 실력이 아니라고 생각되어서 일단 제 수준에서 가능한만큼 작성합니다!
위 코드처럼 작성하고나니 굉장히 코드가 더럽다(ㅋㅋ) 싶어서 다시 작성해봤어요!
n = int(input())
moves = input().split()
x, y = 1, 1
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
types = ['L', 'R', 'U', 'D']
for move in moves:
for i in range(len(types):
if 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)
이렇게 다시 작성해봤습니다 !!
아 그리고 문제 풀면서 실수한 점이 딱 두 가지 있었어요.
이렇게 두 가지를 놓쳤습니당 하하
그래서 제시된 테케만 수행하기 보다는 여러 테케를 수행해보면서 놓치는 부분이 있는지 확인해보는 것이 좋은 거 같습니닷
이런 유용한 정보를 나눠주셔서 감사합니다.