

📌 문제 탐색하기
- R X C 크기의 방에서 로봇에게 이동 방향을 미리 주고 이동시켜 로봇의 최종 위치를 판단하는 문제이다.
- 로봇은 장애물이 있는 좌표로는 이동이 불가능하고, 왔던 길로도 이동할 수 없다.
- 로봇에게 주어진 방향이 장애물이나 왔던 길로 가는 방향이라면 다음 이동 방향으로 움직일 수 있다.
- 주어진 이동 방향의 마지막까지 이동했다면 방향 설정을 처음부터 다시 한다.
- 방향이 (1, 2, 3, 4)로 주어졌다면 (1, 2, 3, 4 방향으로 이동하다가 다시 1로 이동함)
💡 알고리즘 선택
- 2차원 배열을 통해 방과 방의 내부를 구현하고, 로봇의 현재 좌표를 수정해가면서 움직임을 구현해야 한다.
- 로봇이 주어진 이동 방향에 따라 움직이다가 장애물, 왔던 길, 벽을 만나면 이동 방향을 다음 방향으로 바꿔서 계속 이동하게 하고, 이동 방향을 바꿨을 때 마다 blockCount를 세어서 주어진 방향의 갯수와 동일해지면 더 이상 움직일 수 없다고 판단하여 최종 좌표를 출력한다.
- 정상적으로 이동을 한번이라도 했다면 blockCount를 다시 0으로 초기화하여 이동을 계속 한다.
📌 코드 설계하기
1. 문제의 input을 입력 받아서 r, c (방의 크기)에 값을 할당한다.
2. r x c 크기의 2차원 배열 room 리스트를 만들고, 장애물의 위치를 입력 받아서 room에 'x'로 표시한다.
3. 로봇이 더 이상 움직일 수 없을 때 까지 주어진 조건에 따라 로봇을 이동 방향에 따라서 움직인다.
4. 현재 방향에 따라 맞게 이동했다면 지나온 길은 room에 1로 저장하고 로봇의 x, y 좌표를 바꿔주고, blockCount를 0으로 초기화 한다.
5. 방향을 따라서 이동했으나 이동할 수 없는 좌표라면 blockCount +1를 해서 막힌 횟수를 세고, idx +1를 해서 이동 방향을 다음 방향으로 바꿔준다.
📌 시도 회차 수정 사항 (Optional)
1회차
문제를 잘못 이해해서 주어진 이동 방향을 모두 사용하면 프로그램을 종료하고 현재 위치를 출력하도록 했었는데,
이동 방향을 모두 사용하면 다시 처음으로 돌아가서 다시 이동해야 했었다.
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
nx = x + dx[direction[idx % len(direction)] - 1]
ny = y + dy[direction[idx % len(direction)] - 1]
다음과 같이 idx % len(direction)을 해서 이동 방향을 처음부터 끝까지 반복할 수 있도록 하였고, dx의 인덱스가 0부터 시작하므로 direction[idx % len(direction)] - 1를 해줘서 사용자가 이동 방향을 1로 설정했을 때, dx와 dy에서 0번 인덱스를 불러오도록 하였다.
📌 정답 코드
r, c = map(int, input().split())
room = [[0] * c for _ in range(r)]
object = int(input())
obPos = []
for i in range(object):
x, y = map(int, input().split())
obPos.append((x, y))
startX, startY = map(int, input().split())
direction = list(map(int, input().split()))
for i, j in obPos:
room[i][j] = 'x'
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
x = startX
y = startY
idx = 0
flag = True
blockCount = 0
while(flag):
nx = x + dx[direction[idx % len(direction)] - 1]
ny = y + dy[direction[idx % len(direction)] - 1]
if (r > nx >= 0 and c > ny >= 0 and room[nx][ny] == 0):
room[x][y] = 1
x = nx
y = ny
blockCount = 0
else:
if blockCount == len(direction):
flag = False
print(x, y)
blockCount += 1
idx += 1