코딩테스트/파이썬

[백준/14503/파이썬] 로봇 청소기 (Python,구현)

JI NY 2023. 4. 13. 10:55

[백준/파이썬] 14503번 : 로봇 청소기 (Python,구현)

14503번: 로봇 청소기 (acmicpc.net)

 

 

코드

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

from sys import stdin
n, m = map(int,stdin.readline().split()) ## 행 , 열
y, x, d = map(int, stdin.readline().split()) ## 처음 위치 (x,y), 방향
arr =[]

for i in range(n):
    arr_temp = list(map(int,stdin.readline().split()))
    arr.append(arr_temp)
    

# a = arr[y][x]
# print(a)

# d 방향
# if d == 0: #북쪽
#     pass
# elif d == 1: #동쪽
#     pass
# elif d == 2: # 남쪽
#     pass
# elif d == 3: # 서쪽
#     pass

# arr[y-1][x] # 북      arr[x-1][y] 북
# arr[y][x-1] # 서      arr[x][y-1]
# arr[y+1][x] # 남      
# arr[y][x+1] # 동
count = 0 # =청소한 칸 



while True:
    # print("현재 위치 : ({}행,{}열), 값 : {}, d값: {}".format(y,x,arr[y][x],d))
    #1. 로봇 청소기 작동
    if arr[y][x] == 0: # 현재 칸이 아직 청소되지 않은 경우, 현재 칸 청소
        arr[y][x] = 222
        count+=1 # 청소한 칸 개수 증가
    # print(arr)
    #2. 현재 칸의 주변 4칸중 청소되지 않은 빈 킨이 없는 경우,
    elif arr[y-1][x] > 0 and arr[y][x-1] > 0 and arr[y+1][x] > 0 and arr[y][x+1] >0: 
        # d 방향
        if d == 0: #북쪽
            if arr[y+1][x] != 1: # 뒤로 한 칸 후진할 수 있다면
                y +=1 # 남쪽으로 이동
                continue # 1번으로 이동
            elif arr[y+1][x] == 1 : # 벽이라 후진할 수 없다면
                break
        elif d == 1: #동쪽
            if arr[y][x-1] != 1: # 뒤로 한 칸 후진할 수 있다면
                x -=1 # 서쪽으로 이동
                continue # 1번으로 이동
            elif arr[y][x-1] == 1: # 후진할 수 없다면
                break 
        elif d == 2: # 남쪽
            if arr[y-1][x] != 1: # 뒤로 한 칸 후진할 수 있다면
                y -=1 # 북쪽으로 이동
                continue# 1번으로 이동
            elif arr[y-1][x] == 1: # 후진할 수 없다면
                break
        elif d == 3: # 서쪽
            if arr[y][x+1] != 1 : # 뒤로 한 칸 후진할 수 있다면
                x +=1 # 동쪽으로 이동
                continue
            elif arr[y][x+1] == 1: # 후진할 수 없다면
                break
    
    #3. 현재 칸의 주변 4칸중 청소되지 않은 빈칸이 있는 경우,
    elif arr[y-1][x] == 0 or arr[y][x-1] == 0 or arr[y+1][x] == 0 or arr[y][x+1] == 0: 
        # d 방향
        if d == 0: #북쪽 ->서
            # 1. 반시계 방향으로 90도 회전한다.
            d = 3 # 서쪽
            # 2. 바라보는 방향 기준으로 앞쪽 칸이 청소되지 않은 빈킨인 경우 한 칸 전진한다.
            if arr[y][x-1] == 0:
                x-=1
            continue #3. 1번으로 돌아간다.
        elif d == 1: #동쪽 -> 북
            # 1. 반시계 방향으로 90도 회전한다.
            d = 0 # 북
            # 2. 바라보는 방향 기준으로 앞쪽 칸이 청소되지 않은 빈킨인 경우 한 칸 전진한다.
            if arr[y-1][x] == 0:
                y-=1
            continue #3. 1번으로 돌아간다.
        elif d == 2: # 남쪽 ->동
            # 1. 반시계 방향으로 90도 회전한다.
            d = 1 # 동
            # 2. 바라보는 방향 기준으로 앞쪽 칸이 청소되지 않은 빈킨인 경우 한 칸 전진한다.
            if arr[y][x+1] == 0:
                x+=1
            continue #3. 1번으로 돌아간다.
        elif d == 3: # 서쪽 -> 남
            # 1. 반시계 방향으로 90도 회전한다.
            d = 2 # 남
            # 2. 바라보는 방향 기준으로 앞쪽 칸이 청소되지 않은 빈킨인 경우 한 칸 전진한다.
            if arr[y+1][x] == 0:
                y+=1
            continue  #3. 1번으로 돌아간다.
# arr[y-1][x] # 북
# arr[y][x-1] # 서
# arr[y+1][x] # 남
# arr[y][x+1] # 동

print(count)

풀이

코드는, if문을 사용하여 문제에 나와있는 것과 그대로 구현했다.


로봇 청소기는 다음과 같이 작동한다.

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90∘ 회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다

또한, 입력받을 때 (i, j) 입력받는 건 (x, y)가 아니라(i행, y열)이다. (이걸 처음엔 반대로 해서 틀렸다..)

-> 그래서 x, y는 x행 y열로 받았다

 

그리고 동, 서, 남, 북을 표현하려면 2차원 배열에서 x, y값을 다음과 같이 조정하면 된다. 


후기

처음으로 직접 풀어본 구현 골드문제!!! 

너무 뿌듯하다