[백준]14503(파이썬) - 로봇청소기

resilient

·

2021. 12. 6. 16:46

728x90
반응형

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

  • 이 문제도 삼성 기출문제입니다.
  • 삼성 기출문제는 구현이 대부분인데 풀면서 느끼는 건 구현은 진짜 '하라는 대로 해라'인 것 같습니다.

이제 문제풀이를 해보겠습니다.

  • 먼저 '현재 방향을 기준으로 왼쪽부터 탐색한다'라는 조건을 구현하기 위해 이전 문제들을 풀 때와는 다르게 dx, dy를 초기화해줬습니다.
  • 그다음으로는 왼쪽 다음에 그 왼쪽인 아래 방향, 그다음은 오른쪽, 그 다음은 위쪽 방향을 탐색해주기 위해서 
    d = (d+3) % 4의 식을 이용했습니다.
  • 작업이 필요할 경우, 대부분의 구현 문제와 비슷하게 방문처리를 해주고 , cnt += 1을 해줬습니다.
  • 아래 두 조건에 '네 방향 모두 청소가 되어있거나'라는 문장이 있는데, 이 부분을 구현해주기 위해서 flag 변수를 이용했습니다. 하나라도 청소할 방향이 남아있으면 처음에 0으로 초기화 해준 flag를 1로 변경해줬습니다.
  • 만약에 flag가 0일 때 (네 방향 모두 청소가 되어있을 때), 후진했는데 벽일 경우에는 값을 출력하게 했고, 후진을 했을 때 벽이 아닌 경우에는 방향을 유지한 채 후진을 한 뒤, '현재 방향을 기준으로 왼쪽부터 탐색하기' 단계로 돌아갈 수 있도록 구현했습니다.

 

import sys
input = sys.stdin.readline
from collections import deque

n,m = map(int,input().split())
graph = []
visited = [[0] * m for _ in range(n)]
r,c,d = map(int,input().split())

# d => 0,3,2,1 순서로 돌아야한다.
dx = [-1,0,1,0]
dy = [0,1,0,-1]

for _ in range(n):
    graph.append(list(map(int,input().split())))

# 처음 시작하는 곳 방문 처리
visited[r][c] = 1
cnt = 1

while 1:
    flag = 0
    # 4방향 확인
    for _ in range(4):
        # 0,3,2,1 순서 만들어주기위한 식
        nx = r + dx[(d+3)%4]
        ny = c + dy[(d+3)%4]
        # 한번 돌았으면 그 방향으로 작업시작
        d = (d+3)%4
        if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
            if visited[nx][ny] == 0:
                visited[nx][ny] = 1
                cnt += 1
                r = nx
                c = ny
                #청소 한 방향이라도 했으면 다음으로 넘어감
                flag = 1
                break
    if flag == 0: # 4방향 모두 청소가 되어 있을 때,
        if graph[r-dx[d]][c-dy[d]] == 1: #후진했는데 벽
            print(cnt)
            break
        else:
            r,c = r-dx[d],c-dy[d]

 

 

반응형