Notice
Recent Posts
Recent Comments
Today
Total
05-03 00:03
Archives
관리 메뉴

Jeongchul Kim

백준 삼성 코딩 기출 문제 - 로봇청소기 python 본문

Algorithm

백준 삼성 코딩 기출 문제 - 로봇청소기 python

김 정출 2019. 10. 19. 12:59

백준 삼성 코딩 기출 문제 - 로봇청소기 python



출처 : BAEKJOON ONLINE JUDGE

로봇청소기 (https://www.acmicpc.net/problem/14503)


문제 설명

NxM의 크기의 맵에서 로봇 청소기가 청소를 진행합니다. 주어진 위치에서 청소를 진행하고, 현재 방향을 기준으로 왼쪽 방향으로 회전하면서 탐색을 진행합니다. 빈 칸(0)이면 전진하고 청소(2)합니다. 왼쪽 방향에 청소할 공간이 없으면 회전합니다. 네 방향 모두 청소(2)가 되었거나 벽(1)이라면, 방향을 유지한 채 한 칸 후진합니다. 만약 후진도 할 수 없는 경우라면 작동을 멈춥니다.


문제 풀이

[1] 입력을 받습니다.

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


[2] 회전에 따라 이동하는 (x,y)를 정의하고, 현재 위치에서 청소(2)를 합니다.

dx, dy = (-1, 0, 1, 0), (0, 1, 0, -1) # 북쪽(0), 동쪽(1), 남쪽(2), 서쪽(3)
board[x][y] = 2 # 빈칸(0), 벽(1), 청소(2)


[3] 4방향을 모두 탐색하고, 왼쪽 회전에 따른 방향을 정의합니다.

 - 북(위)(0)->서(왼)(1)->남(아래)(2)->동(오른)(3)->북(위)(0)

 - 동(3) -> 북(0) 이 되기 위해서는 (3+1)%4 = 0. 즉, (d+3)%4가 다음 방향이 됩니다.

[4] 이동을 하여 빈칸이라면, 청소를 하고, 청소 횟수를 증가합니다. x, y는 이동한 위치로 저장합니다.

[5] 4방향으로 이동이 불가능하고, 후진시 벽(1)이라면 작동 종료 합니다. 반대로 벽이 아니라면 후진합니다.

def solve(x, y, d, answer):
    while True:
        check = False
        for k in range(4): # 4방향을 탐색한다.
            nd = (d + 3) % 4 # 회전
            next_x, next_y = x + dx[nd], y + dy[nd]
            d = nd
            if not board[next_x][next_y]: # 빈칸이라면
                board[next_x][next_y] = 2 # 청소한다.
                answer += 1 # 청소 횟수 증가
                x, y = next_x, next_y
                check = True
                break
        if not check: # 4방향으로 이동이 불가능하고,
            if board[x - dx[d]][y - dy[d]] == 1: # 후진시 벽이라면
                return answer # 작동 종료
            else:
                x, y = x - dx[d], y - dy[d] # 후진한다. 


[6] 최종적으로 출력합니다.

print(solve(x, y, d, 1))



전체 코드

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

dx, dy = (-1, 0, 1, 0), (0, 1, 0, -1) # 북쪽(0), 동쪽(1), 남쪽(2), 서쪽(3)
board[x][y] = 2 # 빈칸(0), 벽(1), 청소(2)

def solve(x, y, d, answer):
    while True:
        check = False
        for k in range(4): # 4방향을 탐색한다.
            nd = (d + 3) % 4 # 회전
            next_x, next_y = x + dx[nd], y + dy[nd]
            d = nd
            if not board[next_x][next_y]: # 빈칸이라면
                board[next_x][next_y] = 2 # 청소한다.
                answer += 1 # 청소 횟수 증가
                x, y = next_x, next_y
                check = True
                break
        if not check: # 4방향으로 이동이 불가능하고,
            if board[x - dx[d]][y - dy[d]] == 1: # 후진시 벽이라면
                return answer # 작동 종료
            else:
                x, y = x - dx[d], y - dy[d] # 후진한다.

print(solve(x, y, d, 1))


Comments