코딩테스트/파이썬
[백준/14503/파이썬] 로봇 청소기 (Python,구현)
JI NY
2023. 4. 13. 10:55
[백준/파이썬] 14503번 : 로봇 청소기 (Python,구현)
코드
# 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문을 사용하여 문제에 나와있는 것과 그대로 구현했다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변 4 칸 중 청소되지 않은 빈칸이 없는 경우,
- 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
- 현재 칸의 주변 4 칸 중 청소되지 않은 빈 칸이 있는 경우,
- 반시계 방향으로 90∘ 회전한다.
- 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다
또한, 입력받을 때 (i, j) 입력받는 건 (x, y)가 아니라(i행, y열)이다. (이걸 처음엔 반대로 해서 틀렸다..)
-> 그래서 x, y는 x행 y열로 받았다
그리고 동, 서, 남, 북을 표현하려면 2차원 배열에서 x, y값을 다음과 같이 조정하면 된다.
후기
처음으로 직접 풀어본 구현 골드문제!!!
너무 뿌듯하다