본문 바로가기

파이썬알고리즘/백준

[백준 / 14503 ] 로봇청소기

1. 문제 이해

입력값:
N, M (3 이상 50 이하, 세로 가로)
R,C,d (위치좌표 , 방향 (북동남서 0 1 2 3)
0 또는 1 (N 줄에 걸쳐)

유의해야 할 점:
1. 로봇청소기가 있는 칸의 상태는 항상 빈 칸
2. 이미 청소되어있는 칸 청소 불가
3. 벽 통과 물가

출력 값:
 청소 한 칸의 수

 

2. 문제 풀이 법

문제에서 주어진 조건들을 코드로 짜면되는것같다.

 

 

3. 어려웠던 점

1.문제 이해를 못해서 힘들었었다.
2. // 랑 % 헷갈려서 못했다.

 

dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
def iswall(y,x):
    if 0 <= x < M and 0<= y < N:
        if home[y][x] == 1:
            return True
        else:
            return False
    return True

def clean(y,x,dir):
    global cnt
    home[y][x] = 2 # 청소하면 2
    cnt += 1

    while True: # 왼쪽탐색 존나하기
        result = 0
        # 내기준 왼쪽


        for k in range(0,4): #네면탐색
            rx = x + dx[k]
            ry = y + dy[k]
            if iswall(ry,rx)or home[ry][rx] == 2:
                result += 1


        if result == 4: # 네 면이 청소 되어있거나 벽일경우
            rx = x - dx[dir]
            ry = y - dy[dir]
            if iswall(ry, rx): # 후진해서도 벽이면
                return
            else:
                y, x = ry, rx
                continue

        temp_dir = (dir+3)% 4 #왼쪽
        ry = y + dy[temp_dir]
        rx = x + dx[temp_dir]

        if iswall(ry,rx) or home[ry][rx] == 2:
            dir = temp_dir
            continue

        if iswall(ry,rx) == False and home[ry][rx] == 0:
            clean(ry,rx,temp_dir)
            return





N, M = map(int,input().split())
r, c, d = map(int,input().split())
home = []
cnt = 0
for _ in range(N):
    home.append(list(map(int,input().split())))
clean(r,c,d)
print(cnt)

4. 배운 점

이 세상에 천재가 너무많다.

제 결과입니다.

문제풀기전 생각했던 풀이과정 입니다

혹시 더 좋은 풀이나 조언이 있다면 댓글 달아주시거나 

nsk324@naver.com으로 메일 보내주십시오!

 

'파이썬알고리즘 > 백준' 카테고리의 다른 글

[백준 / 17471] 게리맨더링  (0) 2019.12.29
[백준 / 2636] 치즈  (0) 2019.12.24
[백준 / 17135] 캐슬 디펜스  (0) 2019.12.20