작심 365

[백준 14503번] 로봇 청소기 - (python,java) 본문

코테/백준

[백준 14503번] 로봇 청소기 - (python,java)

eunKyung KIM 2024. 9. 16. 00:22

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

 

Idea

이 문제를 쉽게 풀기위해서는 격자상 동서남북 이동 을 위한 배열을 선언할때 청소기가 바라보는 방향의 값과 배열의 인덱스를 일치시켜서 풀어야 된다. 

청소기는 청소 작동이 중지되기 전까지 같은 일을 반복하기 때문에 while 문 안에 모든 로직을 작성한다.

그리고 코드 흐름이 분기되는 경우는 크게 두가지인데 ,  주변 4칸중 청소되지 않은 빈 칸이 없는 경우와 있는 경우로 나뉜다.

따라서 이 부분을 if else 문으로 처리해 주었다. 

문제에서 방의 가장자리는 벽이라고 했기때문에 청소기가 위치를 이동하는 경우에 해당 위치가 배열의 인덱스 범위를 벗어나지 않는지 확인하는 부분은 건너뛰어도 된다. 

 

문제를 풀면서 생각하기 어려웠던 부분은 반 시계방향으로 90도로 계속 회전할때 dir 값을 변경해 주는 부분이였다. 

처음에 북쪽을 바라보는데서 시작했다고 하면 dir 값은 다음 처럼 변하게 된다. 0 -> 3 -> 2 -> 1 -> 0 -> 3 -> 2 -> 1 -> .....

즉 dir -> dir - 1 값이 되는데 dir 이 0일때 -1 을 하면 음수로 넘어가기때문에 이 부분을 처리하기 위해서 (dir-1) + 4 = dir + 3 에서 4를 나눈 나머지로 식을 만들었다. 

코드

Python

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

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

cnt = 0 # 청소를 한 칸의 개수

while True:
    if a[x][y]==0: # 현재 로봇 청소기가 있는 칸의 위치가 청소를 안한 빈칸일 경우
        a[x][y]=2 # 청소 처리
        cnt+=1

    # 주변 4칸중 청소되지 않은 빈 칸이 없는 경우
    if a[x-1][y]!=0 and a[x+1][y]!=0 and a[x][y-1]!=0 and a[x][y+1]!=0:
        nx = x - dx[dir]
        ny = y - dy[dir] 
        if a[nx][ny] == 1: # 벽이면 청소 중지
            break
        else: # 벽이 아니면 청소기 위치 이동
            x = nx
            y = ny 
    else: # 주변 4칸중 청소되지 않은 빈 칸이 하나라도 있는 경우
        dir = ( dir + 3 ) % 4 # 반 시계방향으로 90도 회전
        nx = x + dx[dir]
        ny = y + dy[dir]
        if a[nx][ny] == 0: # 90도 회전후 앞쪽 칸이 청소되지 않은 빈칸인 경우 전진
            x = nx
            y = ny
        
print(cnt)

 

Java

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int [][] a = new int[n][m]; // 방
        int x = sc.nextInt();
        int y = sc.nextInt();
        int dir = sc.nextInt();

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                a[i][j] = sc.nextInt();
            }
        }

        int cnt = 0;
        int[] dx = {-1,0,1,0};
        int[] dy = {0,1,0,-1};

        while(true){
            if(a[x][y]==0){ // 청소가 필요한 경우
                a[x][y] = 2; // 청소 완료 표시
                cnt+=1;
            }

            if(a[x+1][y]!=0 && a[x-1][y]!=0 && a[x][y-1]!=0 && a[x][y+1]!=0){
                if(a[x-dx[dir]][y-dy[dir]]==1){
                    break;
                }else {
                    x -= dx[dir];
                    y -= dy[dir];
                }
            }else{
                dir = (dir + 3) % 4;
                if(a[x+dx[dir]][y+dy[dir]]==0){
                    // 청소되지 않은 빈 칸인 경우 전진
                    x += dx[dir];
                    y += dy[dir];
                }
            }
        }

        System.out.println(cnt);


    }
}

 

Comments