Algorithm Problem/Python

[python] 백준 - 14503. 로봇 청소기 (삼성 SW 역량 테스트 기출 문제)

deo2kim 2020. 5. 12. 00:14
반응형

출처 : BACKJOON ONLINE JUDGE

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

문제 요약

1(벽)과 0(청소가능)으로 구성 된 2차원 배열에 로봇 청소기 한대가 놓여있다. 로봇청소기는 바라보고 있는 방향이 있으며 벽을 제외한 인접한 네방향으로 이동할 수 있다. 로봇 청소기가 이동하며 청소한 구역의 수를 구하는 문제

 

 ※ 특별한 알고리즘 없이 제시된 상황을 구현하는 문제이다.

 

1. 입력

sero, garo = map(int, input().split())  # n, m
x, y, direction = map(int, input().split())  # r, c, d
field = [list(map(int, input().split())) for _ in range(sero)]

 

2. 방향설정

문제에서 제시된 것과 같이 북 동 남 서로 방향을 잡았다.

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

 

3. 청소와 이동

바라보고 있는 방향에서 왼쪽부터 차례로 탐색하며, 청소한 곳이 있을 때와 모든 방향 탐색이 끝난 뒤 청소한 곳이 없을 때로 나눠준다.

- 청소가 가능 할 때 -

청소 count 는 1부터 시작하며, 청소가 가능한 곳으로 이동할 때 count 를 +1 씩 더해준다.

청소가 끝난 곳은 청소가 가능한 곳과 구별할 수 있도록 기존의 값인 0에서 2로 바꿔준다.

- 네 방향에 더 이상 청소할 곳이 없을 때 -

뒤쪽 방향이 벽이 아니라면 한칸 후진한다.

뒤쪽 방향이 벽이라면 더 이상 움직일 수 없다. (끝)

cnt = 1
while True:
    field[x][y] = 2  # 청소가 끝난 곳
    for k in range(direction-1, direction-1-4, -1):  # 왼쪽 방향부터 탐색하므로 현재방향-1 부터 시작해서 네번 탐색
        k += 4  # 계산하기 쉽게 (-)인덱스를 (+)인덱스로 바꿔준다.
        if k > 3:
            k = k % 4

        nx = x + dx[k]
        ny = y + dy[k]
        # 청소할 곳이 있을 때
        if field[nx][ny] == 0:
            x = nx  # 청소 할 곳으로 이동
            y = ny
            direction = k  # 바라보는 방향을 움직인 방향으로 바꿔준다.
            cnt += 1  # 청소 하고 카운트 + 1
            break

    else:
        # 모든 방향에 더 이상 청소할 곳이 없을 때
        nx = x - dx[direction]
        ny = y - dy[direction]
        # 후진 할 곳이 있을 때
        if field[nx][ny] != 1:
            x = nx
            y = ny
        # 후진 할 곳이 없을 때
        else:
            break

 

4. 전체코드

sero, garo = map(int, input().split())  # n, m
x, y, direction = map(int, input().split())  # r, c, d
field = [list(map(int, input().split())) for _ in range(sero)]

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

cnt = 1
while True:
    field[x][y] = 2  # 청소가 끝난 곳
    for k in range(direction-1, direction-1-4, -1):  # 왼쪽 방향부터 탐색하므로 현재방향-1 부터 시작해서 네번 탐색
        k += 4  # 계산하기 쉽게 (-)인덱스를 (+)인덱스로 바꿔준다.
        if k > 3:
            k = k % 4

        nx = x + dx[k]
        ny = y + dy[k]
        # 청소할 곳이 있을 때
        if field[nx][ny] == 0:
            x = nx  # 청소 할 곳으로 이동
            y = ny
            direction = k  # 바라보는 방향을 움직인 방향으로 바꿔준다.
            cnt += 1  # 청소 하고 카운트 + 1
            break

    else:
        # 모든 방향에 더 이상 청소할 곳이 없을 때
        nx = x - dx[direction]
        ny = y - dy[direction]
        # 후진 할 곳이 있을 때
        if field[nx][ny] != 1:
            x = nx
            y = ny
        # 후진 할 곳이 없을 때
        else:
            break
    # for i in field:
    #     print(i)
    # print()
print(cnt)
반응형