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 |