코린이의 소소한 공부노트

[프로그래머스/Lv.1] 공원 산책 본문

코딩테스트 풀이/JAVA

[프로그래머스/Lv.1] 공원 산책

무지맘 2023. 5. 9. 00:53

1. Input, Output, Example

로봇 강아지의 산책은 명령에 따라 진행한다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인한다.

// 주어진 방향으로 이동할 때 공원을 벗어나는가?

// 주어진 방향으로 이동 중 장애물을 만나는가?

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행한다.

- 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 반환

 

2. Constraint

1) 공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1)이다.

2) 3 park의 길이 50

3) 3 park[i]의 길이 50

4) park[i]S, O, X로 이루어져 있다.

5) S는 시작지점, O는 통로, X는 장애물이고, S1개만 주어진다.

6) park는 직사각형 모양이다.

7) 1 routes의 길이 50

8) routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타낸다.

9) 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행한다.

10) routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미한다.

11) op는 다음 네 가지중 하나로 이루어져 있습니다.

    N : 북쪽으로 주어진 칸만큼 이동합니다.

    S : 남쪽으로 주어진 칸만큼 이동합니다.

    W : 서쪽으로 주어진 칸만큼 이동합니다.

    E : 동쪽으로 주어진 칸만큼 이동합니다.

12) 1 n 9

 

3. Code

1) 첫 코드(2023/05/08)

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        int h = park.length, w = park[0].length(); // row, col
        for(int i=0 ; i<h ; i++)
            for(int j=0 ; j<w ; j++)
                if(park[i].charAt(j)=='S'){
                    answer[0] = i; answer[1] = j;
                    break;
                }
        for(int i=0 ; i<routes.length ; i++){
            int move = routes[i].charAt(2)-'0';
            if(routes[i].charAt(0)=='E'){
                if(answer[1]+move>=w) continue;
                boolean block = false;
                for(int j=1 ; j<=move && !block ; j++)
                    if(park[answer[0]].charAt(answer[1]+j)=='X')
                        block = true;
                if(!block)
                        answer[1] += move;
            } else if(routes[i].charAt(0)=='W'){
                if(answer[1]-move<0) continue;
                boolean block = false;
                for(int j=1 ; j<=move && !block ; j++)
                    if(park[answer[0]].charAt(answer[1]-j)=='X')
                        block = true;
                if(!block)
                        answer[1] -= move;
            } else if(routes[i].charAt(0)=='S'){
                if(answer[0]+move>=h) continue;
                boolean block = false;
                for(int j=1 ; j<=move && !block ; j++)
                    if(park[answer[0]+j].charAt(answer[1])=='X')
                        block = true;
                if(!block)
                        answer[0] += move;
            } else{
                if(answer[0]-move<0) continue;
                boolean block = false;
                for(int j=1 ; j<=move && !block ; j++)
                    if(park[answer[0]-j].charAt(answer[1])=='X')
                        block = true;
                if(!block)
                        answer[0] -= move;
            }
        }
        return answer;
    }
}