6/28 미경이 스터디

코변·2022년 6월 28일
0
post-thumbnail

Photo by Pietro Mattia on Unsplash

14503 로봇 청소기

row, col = map(int, input().split())
cur_y,cur_x, pos  = (map(int, input().split()))
visited =[[0] * col for _ in range(row)]
map_ = []
for _ in range(row):
    map_.append(list(map(int, input().split())))
visited[cur_y][cur_x] = 1
cnt = 1
turn_time = 0
# 북 동 남 서
dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
while True:
# 포지션을 왼쪽으로 돌림
    pos = 3 if pos-1 == -1 else pos -1
    ny = cur_y + dy[pos]
    nx = cur_x + dx[pos]
    if visited[ny][nx]==0 and map_[ny][nx] == 0:
        visited[ny][nx] = 1
        cur_y = ny
        cur_x = nx
        cnt += 1
        turn_time = 0
        continue
    else:
    # 왼쪽으로 돌았을 때 청소가 불가능하다면 다음바퀴를 돌림
        turn_time += 1
    if turn_time == 4:
    # 네번째 바퀴를 마치고 나서 뒤로 이동
        ny = cur_y - dy[pos]
        nx = cur_x - dx[pos]
        # 청소가 가능하면 이동
        if map_[ny][nx] == 0:
            cur_x = nx
            cur_y = ny
        # 아니라면 종료
        else:
            break
        turn_time = 0
print(cnt)

내가 이해한 룰

  1. 현재위치를 청소한다. (0을 1로 바꿔준다.)
  2. 다음 위치를 탐색한다. (왼쪽으로 돎)
  3. 다음 위치가 이미 청소를 했거나 벽이라면 다시 왼쪽으로 돌아 위치를 탐색한다.
  4. 4방향을 모두 돌았음에도 청소를 할 수 없다면 뒤로 후진한다.
  5. 후진시에 뒤쪽이 벽인지 확인해 벽이라면 작동을 멈추고
  6. 아니라면 한 칸 후진해 다시 로직을 실행한다.

문제풀이

  1. 처음에 문제를 접근했을 때 청소한 구역을 따로 선언하지 않고 지도상에 0을 1로 바꾸었고 변경된 값으로 인해서 예상한 값과 다른 값이 나왔다. => 마지막 로직에서 벽인지를 검사해야하는데 벽이 아니라 청소한 부분까지 벽으로 인식해서 실패!
  2. 와 매일 이걸 쓰는게 좋다는 걸 느끼는게 지금 이 글을 쓰면서 정리하다보니 왜 내 로직이 실패했는지 정리가 된다.
  3. 청소한 구역확인을 visited로 따로 선언해 청소를 방문하고 나면 청소를 했다고 표시를 해준다.
  4. 4방향 체크 로직을 참조한 코드에서는 함수를 통해 구현했지만 나는 한줄 if문으로 구현해봤다.
  5. 마지막으로 turn_time이 4번이 되면 4방향을 다 확인한 거니까 후진을 해준다.
  6. 후진이 불가능한 벽이라면 while문을 탈출해서 cnt를 출력해준다.

출처 : https://wewinserv.tistory.com/173

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글