[백준]14503번 로봇 청소기 - python 파이썬

hyewon9913·2024년 7월 19일
0

코딩테스트(python)

목록 보기
46/46

문제

이 문제는 문제에서 주어진 로직이 번거로워서 그렇지 구현자체는 bfs 를 이용하면 되는 문제이다.

bfs를 활용한 미로 문제를 풀 때 처럼 구현을 해주지만 여기서 문제의 조건에 맞게 변형을 해주어서 문제를 해결했다.

이때 처음 문제를 풀이했을 때 계속해서 오답이 나왔는데 왜 그런지 이유를 몰랐었다.

이후 찾게된 이유는 바로 주변 4칸에 빈칸이 있어서 반시계방향으로 회전한 후 전진을 해줄 때 전진할 곳이 청소가 되지 않은 빈칸인 경우를 고려해주지 않았기 때문이다.

이 부분은 문제에 직접적으로 주어져있지 않아서 간과하기 쉬운데 이 부분을 빠뜨리면 가야할 곳을 전부 방문하지 못한 채 종료되고 만다.

이 경우까지 고려해서 작성한 코드는

n, m = map(int, input().split())
start = list(map(int, input().split()))
rooms = [list(map(int, input().split())) for _ in range(n)]

from collections import deque
visited = [[0]*m for _ in range(n)]


ans = 0
x,y,d = start[0] , start[1], start[2]
q = deque()
q.append((x,y,d))

visited[x][y] = 1
#시작하는 곳이 청소가 안된 빈칸일 때
if rooms[x][y] == 0:
    ans += 1
    #청소된 곳은 2로 표시
    rooms[x][y] = 2
dx = [-1,1,0,0]
dy = [0,0,-1,1]

while(q):
    x,y,d = q.popleft()

    #주변 4칸 확인
    check = False
    for i in range(4):
        nx = dx[i] + x
        ny = dy[i] + y
        if 0<= nx <n and 0<= ny <m and rooms[nx][ny] == 0:
            check =True

    #주변 4칸 중 청소되지 않은 칸이 있는 경우
    if check:
        #반시계 방향으로 90도 회전
        if d == 0:
            nd = 3
        else:
            nd = d-1

        # 앞쪽 칸으로 전진후 좌표 구하기
        if nd == 0:
            nx = x -1
            ny = y
        elif nd ==1:
            nx = x
            ny = y+1
        elif nd == 2:
            nx = x+1
            ny = y
        elif nd == 3:
            nx = x
            ny = y-1
        #전진할 좌표가 청소되지 않은 빈칸인경우에 전진
        if 0<= nx <n and 0<=  ny < m  and rooms[nx][ny]==0:
            q.append((nx,ny,nd))
            ans += 1
            #청소된 곳은 2로 표시
            rooms[nx][ny] = 2
        #청소되지않은 빈칸이 주변에 있지만 현재의 반시계방향으로 전진했을 때 빈칸이 아닌 경우 현재위치에 바뀐 방향을 q에 추가해줌
        else:
            q.append((x,y,nd))
    #주변4칸중 청소되지않은 빈칸 없을 경우
    else:
    	#후진 시의 좌표값 구하기
        if d == 0:
            nx = x+1
            ny = y
        elif d ==1:
            nx = x
            ny = y-1
        elif d == 2:
            nx = x -1
            ny = y
        elif d == 3:
            nx = x
            ny = y+1
        #후진할 곳이 벽이 아니라면
        if 0<= nx <n and 0<=  ny < m  and rooms[nx][ny]!=1:
            q.append((nx,ny,d))
            
        #벽이라면 종료
        if rooms[nx][ny]==1:
            print(ans)
            exit()
print(ans)                


이 문제에서 1 이 들어간 부분은 벽이기 때문에 청소를 해준 칸은 1과는 다른 숫자를 넣어주어 구별을 해주어야 한다.

왜냐하면 청소를 하기위해 전진하는 경우가 아니라면 청소를 이미 한 곳도 다시 방문 할 수 있기 때문이다.

생각해야할 조건들이 많아서 이것들을 하나하나 코드로 구현하는 부분이 어려웠
던 문제였다.

profile
차근차근 굴러가는 코딩일지

0개의 댓글