본문 바로가기
JAVA/프로그래머스

[Lv.1] 프로그래머스 - 공원 산책 : Java

by ♡˖GYURI˖♡ 2024. 5. 15.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이해하기

처음엔 구현만 하면 되겠다고 생각했는데, 은근 헷갈렸다.

첫번째 풀이를 하고 제출했는데 줄줄이 실패가 떴다... 이유는 'X'를 마주쳤을 때의 구현을 빼먹어서...!

 

두번째 풀이는 x, y 방향을 반대로 설정해서 실패했다.

 

전부 수정해서 제출했더니 겨우 성공...ㅎ

x, y를 아래와 같이 고정해놓고 풀었더니 해결됐다.

 

 

문제풀이

// 첫번째 풀이 -> 실패 (X 구현을 안 함)
// 두번째 풀이 -> x, y 방향 반대로

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int x = 0;
        int y = 0;
        
        char[][] arr = new char[park.length][park[0].length()];
        
        for (int i = 0; i < park.length; i++) {
            arr[i] = park[i].toCharArray();
            
            if (park[i].contains("S")) {
                x = i;
                y = park[i].indexOf("S");
            }
        }
        
        for (String route : routes) {
            String direction = route.split(" ")[0];
            int distance = Integer.valueOf(route.split(" ")[1]);
                        
            int nx = x;
            int ny = y;
            
            for (int i = 0; i < distance; i++) {
                if (direction.equals("E")) {
                    ny++;
                } else if (direction.equals("W")) {
                    ny--;
                } else if (direction.equals("S")) {
                    nx++;
                } else {
                    nx--;
                }
                
                if (nx >= 0 && ny >= 0 && nx < arr.length && ny < arr[0].length) {
                    if (arr[nx][ny] == 'X') {
                        break;
                    }
                    
                    if (i == distance - 1) {
                        x = nx;
                        y = ny;
                    }
                }
            }
        }
           
        return new int[]{x, y};
    }
}

 

        int x = 0;
        int y = 0;
        
        char[][] arr = new char[park.length][park[0].length()];
        
        for (int i = 0; i < park.length; i++) {
            arr[i] = park[i].toCharArray();
            
            if (park[i].contains("S")) {
                x = i;
                y = park[i].indexOf("S");
            }
        }

 

좌표를 저장할 x, y를 만들어두고 park를 char[][]로 변환한다.

for문을 돌다가 "S"가 있다면 x, y를 "S"의 좌표로 설정한다.

 

        for (String route : routes) {
            String direction = route.split(" ")[0];
            int distance = Integer.valueOf(route.split(" ")[1]);
                        
            int nx = x;
            int ny = y;

 

route를 하나하나 돈다.

split해서 첫번째를 direction, 두번째를 distance로 잡는다.

 

만약 'X'를 마주치게 되면 아예 가지 않은 것으로 해야하기 때문에 x, y 값을 건드리지 않기 위해 nx, ny를 만들었다.

 

            for (int i = 0; i < distance; i++) {
                if (direction.equals("E")) {
                    ny++;
                } else if (direction.equals("W")) {
                    ny--;
                } else if (direction.equals("S")) {
                    nx++;
                } else {
                    nx--;
                }

 

"E"면 동쪽으로 이동해야 하는 것이니 위의 그림에 따르면 y좌표를 ++해주어야 하고, "S"는 반대로 --해주면 된다.

"S"는 x좌표를 ++해주어야 하고, 나머지인 "N"은 --해주면 된다.

 

                if (nx >= 0 && ny >= 0 && nx < arr.length && ny < arr[0].length) {
                    if (arr[nx][ny] == 'X') {
                        break;
                    }
                    
                    if (i == distance - 1) {
                        x = nx;
                        y = ny;
                    }
                }

 

범위를 확인하고, 만약 'X'를 마주친다면 무시할 것이니 break한다.

i가 distance - 1만큼 이동했다면 x, y에 nx, ny 값을 저장한다.