백준 #14503 로봇 청소기 (파이썬)

Yongjun Park·2022년 6월 21일
0

PS(Problem Solving)

목록 보기
25/31

테트로미노 문제도 같은 골드 5인데 왜 이건 훨씬 쉽지?

단순 구현 문제다.

import sys
CLEANED = 2
NORTH, EAST, SOUTH, WEST = 0, 1, 2, 3

N, M = map(int, sys.stdin.readline().rstrip().split())
r, c, d = map(int, sys.stdin.readline().rstrip().split())
room = []
for _ in range(N):
    room.append(list(map(int, sys.stdin.readline().rstrip().split())))

def next_rcd(r, c, d):
    for _ in range(4):
        if d == NORTH:
            if room[r][c-1] == 0:
                return r, c-1, WEST
            d = WEST
        elif d == WEST:
            if room[r+1][c] == 0:
                return r+1, c, SOUTH
            d = SOUTH
        elif d == SOUTH:
            if room[r][c+1] == 0:
                return r, c+1, EAST
            d = EAST
        else: # EAST
            if room[r-1][c] == 0:
                return r-1, c, NORTH
            d = NORTH
    # 4번 실행 후
    if d == NORTH:
        if room[r+1][c] != 1:
            return r+1, c, d
    elif d == WEST:
        if room[r][c+1] != 1:
            return r, c+1, d
    elif d == SOUTH:
        if room[r-1][c] != 1:
            return r-1, c, d
    else: # EAST
        if room[r][c-1] != 1:
            return r, c-1, d
    raise
            

answer = 0
while True:
    if room[r][c] != CLEANED:
        room[r][c] = CLEANED
        answer += 1
    try:
        r, c, d = next_rcd(r, c, d)
    except:
        break
print(answer)

raise를 활용하여 깔끔하게 코딩된 것 같아 올린다.

방향 전환을 나처럼 조건을 나눠서 처리하는 것이 아니라, (dy, dx) 배열 [(-1,0), (0,1), (1,0), (0,-1)]을 만들어서 하나의 수식으로 처리하는 풀이도 많이 보였는데, 그렇게 하면 더 가독성 떨어질 것 같아서 굳이 하진 않았다.

profile
추상화되었던 기술을 밑단까지 이해했을 때의 쾌감을 잊지 못합니다

0개의 댓글