본문 바로가기
코딩테스트/백준 알고리즘 풀이

[백준 알고리즘/Python] 백준 14503번 로봇 청소기, 파이썬 설명

by Godgil 2022. 3. 27.

1. 문제 출처

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

 

2. 생각정리

- 현재방향을 기준으로 다음 방향을 반환해주는 함수 작성하기

- 현재방향 기준으로 뒤쪽 위치를 반환해주는 함수 작성하기

- 나머지는 그냥 하라는대로 하면 될 듯 함

 

 

3. 조각코드

현재방향 기준으로 다음 방향 반환해주는 함수


dx = [-1,0,1,0]
dy = [0,1,0,-1]

def rotate(cd):
    nd = 0
    if cd == 0:
        # d가 북이면 nd는 서
        nd = 3
    elif cd == 1:
        # d가 동이면 nd는 북
        nd = 0
    elif cd == 2:
        # d가 남이면 nd는 동
        nd = 1
    elif cd == 3:
        # d가 서면 nd는 남
        nd = 2
    return nd

 

현재방향 기준으로 뒤쪽 방향 알려주는 함수

 

def back(d):
    if d == 0:
        nd = 2
    elif d == 1:
        nd = 3
    elif d == 2:
        nd = 0
    elif d == 3:
        nd = 1
    return nd

다음 방향을 dx, dy배열 기준 0,1,2,3으로 처리해서 다음 위치를 설정했음

 

4. 전체코드



n, m = map(int, input().split())
sx,sy,d = map(int, input().split())

lst = []
for i in range(n):
    lst.append(list(map(int,input().split())))


def rotate(cd):
    nd = 0
    if cd == 0:
        # d가 북이면 nd는 서
        nd = 3
    elif cd == 1:
        # d가 동이면 nd는 북
        nd = 0
    elif cd == 2:
        # d가 남이면 nd는 동
        nd = 1
    elif cd == 3:
        # d가 서면 nd는 남
        nd = 2
    return nd


# d = 0 북 d == 1 동 , 2남, 3서

dx = [-1,0,1,0]
dy = [0,1,0,-1]

def back(d):
    if d == 0:
        nd = 2
    elif d == 1:
        nd = 3
    elif d == 2:
        nd = 0
    elif d == 3:
        nd = 1
    return nd


end = False
while True:
#     1. 현재위치를 청소한다
    lst[sx][sy] = 2
#     2. 현재 위치에서 현재 방향 기준으로 왼쪽부터 인접 간 탐색
    chk = [True, True, True, True]
    while True:
        nd = rotate(d)
        nx = sx + dx[nd]
        ny = sy + dy[nd]
        if lst[nx][ny] == 0:
            # 청소를 아직 안한곳인경우
            sx = nx
            sy = ny
            d = nd
            break
        elif lst[nx][ny] == 1 or lst[nx][ny] == 2:
            chk[nd] = False
            d = nd
        if chk.count(False) == 4:
#             4방향 다 못가는 경우 한칸 후진
            back_d = back(nd)
            bx = sx + dx[back_d]
            by = sy + dy[back_d]
            if lst[bx][by] == 1:
                end = True
                break
            else:
                sx = bx
                sy = by
                break
    if end:
        break

cnt = 0
for i in range(len(lst)):
    cnt += lst[i].count(2)
print(cnt)

 

5. 마무리

- 가장 기초적인 구현문제인것 같음

- 구현이 약점인데 조금 빨리 풀 수 있도록 많이 풀어봐야겠다고 생각함

- 하라는대로 그냥 적어놓고 반복문만 돌리면 됨

댓글