Algorithm Study/Python

[백준 파이썬] #14503. 로봇청소기

728x90
반응형

풀기 전 생각해보기😮

  • 이차원 배열의 탐색은 범위를 항상 조심할 것
  • 구현 문제

풀이🛫

dcol = [0, 1, 0, -1]
drow = [-1, 0, 1, 0]

def check(col, row, dir):   # dir: 바라보는 방향
    if dir == 0:
        if 0<=col-1 and arr[col-1][row] == 0:
            exp(col-1, row, dir)
    elif dir == 3:
        if 0<=row-1 and arr[col][row-1] == 0:
            exp(col, row-1, dir)
    elif dir == 2:
        if col+1<N and arr[col+1][row] == 0:
            exp(col+1, row, dir)
    elif dir == 1:
        if row+1<M and arr[col][row+1] == 0:
            exp(col, row+1, dir)

def exp_except(col, row, dir):
    if col+1<N and dir == 0 and arr[col+1][row] != 1:
        exp(col+1, row, dir)
    elif row+1<M and dir == 3 and arr[col][row+1] != 1:
        exp(col, row+1, dir)
    elif 0<=col-1 and dir == 2 and arr[col-1][row] != 1:
        exp(col-1, row, dir)
    elif 0<=row-1 and dir == 1 and arr[col][row-1] != 1:
        exp(col, row-1, dir)

def exp(col, row, dir):
    global answer, cnt

    if arr[col][row] == 0:
        answer += 1
        cnt += 1
        arr[col][row] = cnt

    # 4방향 탐색
    for i in range(4):
        check(col, row, (dir-1-i)%4)

    # 네방향 모두 청소가 되어있거나 벽인 경우
    exp_except(col, row, dir)

    # 위 과정이 모두 통과했을때 정답을 출력하고 종료
    print(answer)
    exit()


N, M = map(int, input().split())
r, c, d = map(int, input().split())     # r: 가로, c: 세로, d: 방향(0: 북, 1:동, 2:남, 3:서)
arr = [list(map(int, input().split())) for _ in range(N)]
cnt = 1
answer = 0

exp(r, c, d)

 

핵심 정리🎁

exit() # 함수 재귀와 상관없이 프로그램을 종료시킬 수 있다

 

링크💎

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

후기 😎

  • 디버깅을 위해 어떻게 값을 표시해나갈지도 잘 알아둘 필요를 느꼈다
  • 이차원배열 문제를 풀 때 범위를 고려해야 한다는 것을 잊어버린 탓에 오랫동아 헤메었다.
  • (dir-1-i)%4의 규칙성을 발견하는데 애먹었다. 발견하고 나면 별거 아닌데 말이야
  • 슬슬 알고리즘 풀이 다시 시작하면서 블로그 활동 재개하기!