Baekjoon/구현

🥇[백준] 14503 로봇 청소기 (골드5) / 구현

hellosonic 2023. 6. 24. 11:56

문제요약

나의 코드 및 설명

  • 반시계 방향으로 회전시키는 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%는 차지하는 것 같다. 문제를 꼼꼼히 읽고, 놓치기 쉬운 조건은 꼭 메모해야겠다.