📌 문제 조건
TURN 0: 왼쪽으로 90도 방향을 바꾼다.
TURN 1: 오른쪽으로 90도 방향을 바꾼다.
MOVE d: d만큼 현재 방향에서 직진한다.
시작 위치는 (0, 0), 초기 방향은 (+1, 0)이다!
▷ 출력: 만약, 정사각형 영역을 벗어난다면 -1을 출력하고, 벗어나지 않는다면 현재의 좌표를 출력한다.
문제의 조건 중에서 칸 안에 정보를 얻는 것이 아니므로 (x, y) 값 자체에서 연산해도 무방하다!
📌 구해야 하는 정답
로봇이 (0,0)이 n번의 명령을 수행하며 마지막에 위치하는 좌표를 구해야 한다.
📌 풀이 하기
- 동작 조건은 MOVE와 TURN 2가지이다. 동작 각각에 대한 함수를 정의하여 해도 되지만, 바로바로 위치와 방향이 업데이트 되어야하고, 동작이 간단하므로 함수로 정의하지 않았다.
- 정사각형 S를 벗어나는 경우 처리를 고려해야한다.
- 최종 위치가 벗어났을 때 -1로 처리해줄 뿐만 아니라 MOVE 중에 벗어난다면, -1로 처리해줘야한다.
- TURN: 방향 전환 시에는 시계, 반시계로 순차적으로 변환하므로 ARR = (1, 0), (0, 1), (-1, 0), (0, -1) 움직이는 순서를 고정하면 편하다. 0일때는 인덱스를 1씩 증가하고, 1일 경우에는 1씩 감소하면된다.
📌 코드 설계하기
1. 입력으로 M(정사각형의 한 변)과 n 시도 횟수를 input으로 받는다
2. 변화하는 값은 X, Y좌표와 방향 인덱스 i를 0으로 초기화한다.
3. DX, DY에 d값을 곱해 move한다.
4. 만약, 범위를 벗어나면 -1, 반복문을 빠져나간다.
5. 방향 전환시에 각 0, 1에 따라 인덱스를 증감시켜준다.
📌 시도 회차 수정 사항
- indexError: i는 0에서 3 사이의 값을 가져야 하는데 i += 1, i -= 1을 수행할 때, 범위를 벗어났다.
- 아래와 같이 나타내주면, 항상 0 ~ 3 사이에서 순환할 수 있다.
if mode == 0:
i = (i + 1) % 4 # 방향 인덱스를 0~3 사이로 순환
else:
i = (i - 1) % 4 # 방향 인덱스를 0~3 사이로 순환
📌 정답 코드
import sys
input = sys.stdin.readline
M, n = map(int, input().split())
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
x, y, i = 0, 0, 0
flag = 0
for _ in range(n):
order = list(input().split())
if order[0] == "MOVE":
d = int(order[1])
x += (dx[i] * d)
y += (dy[i] * d)
if x < 0 or x > M or y < 0 or y > M:
flag = -1
break
else:
continue
else: # TURN 일 때
mode = int(order[1])
if mode == 0:
i = (i + 1) % 4
else:
i = (i - 1) % 4
if flag == -1:
print(-1)
else:
print(x, y)
📌 추가 놓친 부분
1. 입력 받을때 order로 배열로 입력받아서 order[0], order[1] 이렇게 했었는데 차라리 type, count = input().split()으로 표현하면 됐었다.
2.
'코딩테스트 > BOJ' 카테고리의 다른 글
[백준] 17266번: 어두운 굴다리 (이분탐색, 파이썬) (0) | 2024.10.19 |
---|---|
[백준] 2503번: 숫자 야구 (구현, 파이썬) (1) | 2024.10.16 |
[백준] 2096: 내려가기 (DP, 파이썬) (0) | 2024.10.14 |
[백준] 14430: 자원 캐기 (파이썬) (0) | 2024.10.12 |
[백준] 10026: 적록색약 (0) | 2024.10.10 |