[백준] 14503 - 로봇 청소기 (Python)

냐항·2021년 12월 18일
7

🍋우앙,,, 구현 문제를 못 풀면 넘 슬프다

이제 꽤나 알고리즘 공부를 했다고 생각했는데 구현 문제를 풀지 못하면 몬가 슬프다. 그런디 골드 이상의 구현 문제는 일부러 문제를 이해하기 힘들게 해놓은 것 같달까. 요 문제도 한 2일 동안 이해가 되지 않았다. 그래서 풀이를 여러 개 보면서 아~~ 이런 의도였군 무릎탁! 했다.

🥑포인트 1. 왼쪽 방향으로 회전

d = (d+3) % 4
방향이 0, 1, 2, 3 이렇게 총 4개다.
그리고 왼쪽으로 돌리면 3, 2, 1, 0 요렇다.
이것을 해결하는 방법은!!! 바로 (d+3)%4라는 것. 무릎 탁!

🧊포인트 2. 후진은,,,??

## 북, 동, 하, 서 ( 시계방향 )
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]

arr[r-dr[d]][c-dc[d]]
요렇게 내가 가지고 있는 방향을 빼주면 그것이 후진을 한 값이다!

## 북, 동, 하, 서 ( 시계방향 )
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]

n, m = map(int, input().split())
r, c, d = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
## 방문 쳌
visited = [[0]*m for _ in range(n)]

## 시작지 방문쳌 and 카운트!
visited[r][c] = 1
cnt = 1

while True:
    flag = 0            ## 아직 아무것도 청소 안했음!
    for _ in range(4):  ## 4방향을 돈다!
        d = (d+3) % 4   ## 왼쪽방향으로 한 칸 돌린다! 중요!!!!!1
        nr = r + dr[d]
        nc = c + dc[d]

        ## 범위 안에 들고, 빈 칸이고, 청소할 수 있다면!
        ## 들려서 청소하고, 카운트하고, 현재 위치를 갱신하고, flag 변경!
        if 0 <= nr < n and 0 <= nc < m and arr[nr][nc] == 0:
            if visited[nr][nc] == 0:
                visited[nr][nc] = 1
                cnt += 1
                r = nr
                c = nc
                flag = 1        ## 청소 했다는 뜻
                break

    if flag == 0:               ## 위의 for문에 들어가지 못했을 때
        ## 즉 네 방향 모두 청소를 할 수 없을 때
        ## 후진 했을 때 벽이면 break
        ## 만약 뒤가 벽이 아니라면! 그 위치를 다시 갱신!!!
        if arr[r-dr[d]][c-dc[d]] == 1:
            print(cnt)
            break
        else:
            r, c = r-dr[d], c-dc[d]

구현 문제를 몇 일 붙들고 있었던 본인은 또 구현 문제를 풀어보았다.
고것은 컨베이어 벨트 문제다!!
사랑니 하나 뽑았더니 밑에 있던 사랑니가 나네,,,
광광,,,,

0개의 댓글