알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 14503 로봇 청소기(구현)

개발자 덕구🐾 2022. 6. 30. 09:17
728x90

 

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

 

문제에 나와있는 순서대로 ( 북, 동, 남, 서 )로 dx,dy를 설정해준다.

 

 

 

1. 왼쪽으로 회전한다. ( 왼쪽에 청소공간이 있든 말든 어쨌든 회전하기 때문이다.)

2-1. 청소할 공간이 있다면 청소하고 그곳으로 위치로 간다. [turn 횟수를 초기화]

2-2. 청소할 공간이 없다면 turn의 횟수만 증가 시킨다.

3. 만약 turn 횟수가 4라면 (주변에 모두 청소가 되어있거나 벽일 경우 )

3-1 . 후진한다.

3-2. 후진한곳이 벽이라면 break

3-3.  벽이 아니라면 후진한다. 

 

 


 

 

💻 코드 : 

n,m = map(int,input().split())

vis = [[0]*m for i in range(n)]
x,y,direction = map(int,input().split()) # 현재 좌표와 내가 보는 방향
vis[x][y] = 1  # 현재 위치 청소 
mp = [list(map(int,input().split())) for i in range(n)]

dx = [-1,0,1,0]
dy = [0,1,0,-1]
# 0 : 북(위) , 1 : 동(오), 2 : 남(아래), 3 : 서(왼)

def turn_left() :
    global direction
    direction-=1 # 왼쪽을 본다.
    if direction < 0 : direction = 3 # 0 보다 작아지면 3으로 초기화
    
count = 1 #  청소한 영역의 갯수 # 처음 주어진 영역을 청소했다고 생각하므로 1로 초기화 
turn_time = 0 


while True :
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]

    if 0<=nx<n and 0<=ny<m and vis[nx][ny] == 0 and mp[nx][ny] == 0 : # 가본적 없고 벽이 아니여야함 
        vis[nx][ny] = 1
        x = nx
        y = ny
        count+=1  # 하나 청소 
        turn_time =0 
        continue   # 다시 While 문 처음으로
    
    else :
        turn_time+=1 
    
    if turn_time == 4 : # 4번 돌았다면 뒤를 확인 
        nx = x - dx[direction]
        ny = y - dy[direction]
        
        if mp[nx][ny] == 0 : # 벽이 아니라면
            x,y  = nx,ny
            turn_time = 0
        else :
            break # while문 종료 
print(count)

 

 

 

 

 


 

 

 

vis 배열을 사용하지 않은 코드 

< 네 방향 모두 청소가 되어있을 때 뒤에 벽이 있는지 확인해야하므로 if 문에 조건을 하나 더 추가해주면 된다. >

# 북 동 남 서     
dx = [-1,0,1,0]
dy = [0,1,0,-1]


def turn_left() :
    global d 
    d -=1 
    if d <0 : d = 3 
    
if __name__=="__main__" :
    n,m = map(int,input().split())
    x,y,d = map(int,input().split())
    mp = [list(map(int,input().split())) for _ in range(n)]
    
    mp[x][y] = 2
    ans = 1 
    turn_time = 0 
    
    while True :
        turn_left()
        nx,ny = dx[d] + x, dy[d] + y 
        if 0 <=nx< n and 0<=ny<m and mp[nx][ny] ==0 : 
            mp[nx][ny] = 2
            x,y = nx,ny 
            ans +=1 
            turn_time = 0
            continue 
        else :
            turn_time +=1 
        if turn_time == 4 :
            nx,ny = x - dx[d] , y - dy[d]
            if mp[nx][ny] == 0 or mp[nx][ny] == 2 :
                x,y = nx,ny 
            else : break
            turn_time = 0 
    print(ans)

 

 

 

 

 

 

참고 블로그 : 

 

https://wewinserv.tistory.com/173

 

[백준14503번, 구현] 로봇 청소기 - Python

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

wewinserv.tistory.com

 

 

복습 : 

20220701

✅ 20220914

반응형