Inflearn Java Coding Test : 청소 문제

song yuheon·2023년 10월 19일
0

Java Algorithm

목록 보기
10/18

문제 : 청소 로봇의 최종 위치를 구하여라


n*n 격자판의 방에 청소기 로봇이 활동합니다. 방에는 로봇이 지나갈 수 없는 장애물이 있습니다. 로봇은 왼쪽 상단에서 시작하여 오른쪽을 향하며, 한 칸 이동하는데 1초가 필요합니다. 방의 경계나 장애물을 만나면 시계방향으로 90도 회전하고, 회전하는데도 1초가 걸립니다.


제한사항
• board의 크기 (3 <= n <= 100)
• board에서 0은 빈 공간이고, 1은 장애물이다.
• board에서 로봇의 시작위치는 0행 0열(가장 왼쪽 가장 위)이다.
• 변수 k는 1,000이하의 자연수이다


문제 풀이 설계



문제 풀이 구현 코드


import java.util.*;
class Solution {
    public int[] solution(int[][] board, int k){
        int direction = 0;
        int []answer = new int[2];
        int n=board.length;
        for (int i = 0; i < k; i++) {
            if(direction==0){
                if(answer[1]==n-1) {
                    direction=1;
                    continue;
                } else if (board[answer[0]][answer[1]+1]==1) {
                    direction=1;
                    continue;
                } else
                    answer[1]+=1;
            } else if (direction==1) {
                if( answer[0]==n-1 ) {
                    direction=2;
                    continue;
                } else if (board[answer[0]+1][answer[1]]==1) {
                    direction=2;
                    continue;
                } else
                    answer[0]+=1;
            } else if (direction==2) {
                if(answer[1]==0) {
                    direction=3;
                    continue;
                } else if (board[answer[0]][answer[1]-1]==1) {
                    direction=3;
                    continue;
                } else
                    answer[1]-=1;
            } else if (direction==3) {
                if( answer[0]==0) {
                    direction=0;
                    continue;
                } else if (board[answer[0]-1][answer[1]]==1) {
                    direction=0;
                    continue;
                } else
                    answer[0]-=1;
            }
        }
        return answer;
    }

    public static void main(String[] args){
        Solution T = new Solution();
        int[][] arr1 = {{0, 0, 0, 0, 0},
                {0, 1, 1, 0, 0},
                {0, 0, 0, 0, 0},
                {1, 0, 1, 0, 1},
                {0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr1, 10)));
        int[][] arr2 = {{0, 0, 0, 1, 0, 1},
                {0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 1},
                {1, 1, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr2, 20)));
        int[][] arr3 = {{0, 0, 1, 0, 0},
                {0, 1, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {1, 0, 0, 0, 1},
                {0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr3, 25)));

    }
}

결과



강의 풀이

핵심 로직

방향에 따른 위치 이동을 배열로 생성해서 지정
    int[] dx = {-1, 0, 1, 0};
	int[] dy = {0, 1, 0, -1};
    
while( k번 반복 )
	현재 위치 x,y에 dx와 dy를 더한다.
    더한 x,y가 0이하이거나, 최대값 n과 동일 혹은 board 값이 1이면 ( 장애물이 있으면 )
    방향을 바꾼다 ( d = (d + 1) % 4; )
    
    그 외의 경우에는 x,y에 더한 값을 저장하고 다음 반복으로 간다.

profile
backend_Devloper

0개의 댓글