문제요약
나의 코드 및 설명
- 반시계 방향으로 회전시키는 turn_left() 함수를 작성하고, while문을 돌려서 반시계 방향으로 회전 했을 때, 다음 좌표가 청소할 수 있는 좌표라면 방문하고, 그렇지 않다면 회전 카운트(cnt)를 1 증가시킨다.
- 회전 카운트가 4가 된다면, 동서남북 네 방향을 모두 탐색한 것이므로, 후진할 수 있는지 확인한다.
n, m = map(int, input().split()) #n:세로 m:가로
y,x, d = map(int, input().split()) #0:북 1:동 2:남 3:서
board = []
for _ in range(n):
board.append(list(map(int, input().split())))
dx = [0,1,0,-1]
dy = [-1,0,1,0]
v = [[0] * m for _ in range(n)]
v[y][x] = 1 #로봇 청소기가 있는 칸은 방문처리
ans = 1
cnt = 0
#0:북 1:동 2:남 3:서(
def turn_left(): #반시계 방향으로 회전
global d
d = d - 1
if d == -1:
d = 3
return d
while True:
d = turn_left() #반시계 방향으로 회전해서 다음 좌표를 탐색한다.
nx = x+dx[d]
ny = y+dy[d]
#만약 다음 좌표가 범위에 있고, 벽이 아니고, 아직 방문하지 않은(청소하지 않은) 좌표라면
if 0<=nx<m and 0<=ny<n and board[ny][nx] == 0 and v[ny][nx] == 0:
v[ny][nx] = 1 #방문한다.
x, y = nx, ny #좌표 갱신
cnt = 0
ans+=1 #청소하는 칸 + 1
else: #만약 다음 좌표에 방문하지 못한다면
cnt+=1 #회전 카운트
if cnt == 4: #만약 회전 카운트가 4가 된다면
#현재 바라보고 있는 방향에서 후진한 좌표를 구한다.
nx = x+dx[(d+2)%4]
ny = y+dy[(d+2)%4]
if 0<=nx<m and 0<=ny<n and board[ny][nx] == 0: #후진이 가능하다면,
x, y = nx, ny #좌표 갱신
cnt = 0 #회전 카운트 초기화
else: #만약 후진이 불가하다면
break #반복문 탈출
print(ans)
피드백
구현 문제를 풀때마다 느끼는 점은, 문제를 제대로 읽고 조건을 놓치지 않는 것이 문제 해결의 70%는 차지하는 것 같다. 문제를 꼼꼼히 읽고, 놓치기 쉬운 조건은 꼭 메모해야겠다.
'Baekjoon > 구현' 카테고리의 다른 글
🥇[백준] 3190 뱀 (골드4) / 구현, 큐, 이왜틀 극복 (0) | 2023.07.09 |
---|---|
🥇[백준] 14891 톱니바퀴 (골드5) / 구현 (0) | 2023.06.26 |
🥇[백준] 15686 치킨 배달 (골드5) / 구현, 백트래킹 (0) | 2023.06.23 |
🥇[백준] 11559 Puyo Puyo (골드4) / 구현 (0) | 2023.06.23 |
🥇[백준] 2638 치즈 (골드3) / 구현, 시간초과 해결, 문제 아이디어 (0) | 2023.06.22 |