alpyrithm_알파이리즘

[알고리즘][Python] 백준(BOJ) 14503 로봇_파이썬 본문

Algorithm/백준 알고리즘_Python

[알고리즘][Python] 백준(BOJ) 14503 로봇_파이썬

알파이 2020. 9. 23. 08:29

 

14503 로봇    www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

 

 

 

 

문제 풀기 전 공부할 것 : 구현, 시뮬레이션

 

 

 

 

 

 

 

 

풀이 1

<내용>

  • 로봇 청소기 작동을 하나하나 다 구현해보기
  • 먼저 왼쪽 방향부터 탐색하고, 한 칸 전진하는 direction 함수를 만든다.
    • 현재 바라보고 있는 방향을 가준으로 왼쪽 방향과 좌표를 return 한다.
  • 네 방향 모두 청소가 이미 되어있거나 벽인 경우 후진하는 back 함수를 만든다.
    • 현재 바라보고 있는 방향을 기준으로 현재 방향과 후진한 좌표를 return 한다.
  • 로봇 청소기 작동을 구현하는 solve 함수를 만든다.
    • 현재 위치가 청소 전이라면 청소한다.
    • 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색을 진행한다.

 

 

 

<코드>

import sys
input = sys.stdin.readline

def direction(r, c, d):
    if d == 0:
        d = 3
        c -= 1
    elif d == 1:
        d = 0
        r -= 1
    elif d == 2:
        d = 1
        c += 1
    else:
        d = 2
        r += 1
    return r, c, d

def back(r, c, d):
    if d == 0:
        r += 1
    elif d == 1:
        c -= 1
    elif d == 2:
        r -= 1
    else:
        c += 1
    return r, c, d

def solve(r, c, d):
    global res
    if board[r][c] == 0:
        res += 1
        board[r][c] = 2
    
    flag = False
    new_r, new_c, new_d = r, c, d
    for _ in range(4):
        new_r, new_c, new_d = direction(new_r, new_c, new_d)
        if 0 <= new_r < n and 0 <= new_c < m:
            if board[new_r][new_c] == 0:
                res += 1
                board[new_r][new_c] = 2
                flag = True
                break
        new_r, new_c, new_d = r, c, new_d
        
                
    if flag:
        return solve(new_r, new_c, new_d)
    else:
        new_r, new_c, d = back(r, c, d)
        if 0 <= new_r < n and 0 <= new_c < m:
            if board[new_r][new_c] != 1:
                return solve(new_r, new_c, d)
    return
    
            

n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]

res = 0
solve(r, c, d)
print(res)

 

 

 

 

 

 

 

 

 

 

풀이 2

<내용>

  • direction과 back을 간단하게 방향만 return 하도록 한다.
  • dx, dy를 통해 방향에 따라 이동할 수 있도록 해준다.

 

 

<코드>

import sys
input = sys.stdin.readline

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def direction(d):
    if d == 0:
        return 3
    elif d == 1:
        return 0
    elif d == 2:
        return 1
    else:
        return 2
    
def back(d):
    if d == 0:
        return 2
    elif d == 1:
        return 3
    elif d == 2:
        return 0
    else:
        return 1
    
def solve(r, c, d):
    global res
    if board[r][c] == 0:
        res += 1
        board[r][c] = 2
    
    flag = False
    new_r, new_c, new_d = r, c, d
    for _ in range(4):
        new_d = direction(new_d)
        new_r, new_c = r+dx[new_d], c+dy[new_d]
        if 0 <= new_r < n and 0 <= new_c < m:
            if board[new_r][new_c] == 0:
                res += 1
                board[new_r][new_c] = 2
                flag = True
                break
        
                
    if flag:
        return solve(new_r, new_c, new_d)
    else:
        back_d = back(d)
        new_r, new_c = r+dx[back_d], c+dy[back_d]
        if 0 <= new_r < n and 0 <= new_c < m:
            if board[new_r][new_c] != 1:
                return solve(new_r, new_c, d)
    return
    
            

n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]

res = 0
solve(r, c, d)
print(res)

 

 

 

 

 

 

 

반응형
Comments