카테고리 없음

백준 [13901 로봇] 파이썬 풀이

oopt1234 2025. 2. 21. 14:31

📌 문제 탐색하기

  • 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