Welcome! Everything is fine.

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

프로그래머스/Lv.1

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

개발곰발 2024. 4. 11.
728x90

📌 문제

 

프로그래머스

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

programmers.co.kr

📌 풀이

주어진 방향과 거리에 따라 로봇강아지를 이동시켜 최종적으로 놓인 위치를 반환하는 문제였다. 쉬워 보였지만 코드를 치면 칠수록 점점 헷갈려갔고..왜 안되지?를 반복하다가 힌트를 보고 풀었다.

 

먼저 해야하는 일을 적어보자면 아래와 같다. 

  • 시작 좌표를 저장한다.
    • park 배열을 돌면서 'S'의 위치를 저장한다.
  • routes 배열을 돌면서 방향과 거리에 따라 로봇강아지를 이동시킨다.
    • 이동하는 경우
      • 공원의 크기를 벗어나지 않고, 장애물이 없다면 이동한다. 가로 방향을 width, 세로 방향을 height 라고 하고 주어진 거리를 n 이라고 한다면, 다음과 같이 움직인다.
        • 동(E) : width + n
        • 서(W) : width - n  
        • 남(S) : height - n
        • 북(N) : height + n
    • 이동하지 않는 경우 
      • 이동한 위치가 공원의 크기를 벗어난다면 이동하지 않는다.
      • 이동한 위치가 장애물이거나 이동하는 도중 장애물을 지나게 된다면 이동하지 않는다.
  • 반복문을 모두 돈 후 최종적으로 도착한 좌표를 int형 배열의 형태로 반환한다.

다음 코드는 처음에 적은 코드의 일부인데, 매 반복문마다 똑같은 검증을 하니 불필요한 코드가 많아보인다. 그리고 코드를 작성하며헷갈린 이유 중 하나가 변수를 x, y로 했기 때문인데..그냥 문제에 나온 것처럼 w, h로 하면 덜 헷갈리지 않았을까 싶다.🙄 또한 시작 좌표를 cx, cy에 넣은 것까지는 좋았지만, 내가 실수한 점은 해당 변수도 for문 안에 넣고 조건에 충족하면 시작 좌표를 계속 갱신시켜 cx, cy에 넣었어야 했다는 점이다.

처음에 적은 엉망진창 코드

📌 전체 코드

작성하던 코드에서 다른 사람의 코드를 보고 약간 고쳐 통과되었다.

import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int H = park.length;
        int W = park[0].length();
        
        int h = 0;
        int w = 0;
        
        for (int i = 0; i < park.length; i++) {
            for (int j = 0; j < park[i].length(); j++) {
                if (park[i].charAt(j) == 'S') {
                    h = i;
                    w = j;
                }
            }
        }
        
        for (String route : routes) {
            String[] arr = route.split(" ");
            String op = arr[0];
            int n = Integer.parseInt(arr[1]);
        
            int nh = h;
            int nw = w;
            
            for (int i = 0; i < n; i++) {
                 if (op.equals("E")) {
                     nw++;
                } else if (op.equals("W")) {
                     nw--;
                 } else if (op.equals("S")) {
                     nh++;
                 } else if (op.equals("N")) {
                     nh--;
                 }
                
                if (nh >= 0 && nh < H && nw >= 0 && nw < W) {
                    if (park[nh].substring(nw, nw + 1).equals("X")) break;
                    if (i == n - 1) {
                        h = nh;
                        w = nw;
                    }
                }
            }
        }
    
        int[] answer = {h, w};
        
        return answer;
    }
}

 

📌 다른 코드

내가 참고한 코드인데, 더 깔끔하고 가독성이 좋은 것 같다고 느꼈다. 우선 시작 좌표를 구할 때도 나처럼 이중 for문을 돌지 않아도 indexOf를 활용해 구할 수 있다는 것을 알게 되었다.  또한 routes 배열을 돌며 이동할 때도 switch문으로 좀 더 깔끔하게 작성한 점이 마음에 든다. 다른 사람들의 코드를 많이 보면서 계속해서 배워나가야겠다..😅

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int h = park.length;
        int w = park[0].length();

        int startH = 0;
        int startW = 0;

        for(int i=0; i<h; i++){
            if(park[i].contains("S"))
            {
                startH = i;
                startW = park[i].indexOf("S"); 
            }
        }

        for(String route : routes){
            String d = route.split(" ")[0];
            int move = Integer.parseInt(route.split(" ")[1]);

            int moveH = startH;
            int moveW = startW;

            for(int i=0; i<move; i++)
            {
                switch(d) {
                    case "S" : moveH++; break; 
                    case "N" : moveH--; break;
                    case "E" : moveW++; break;
                    case "W" : moveW--; break;
                }
            if(moveH>=0&& moveH<h&&moveW>=0&&moveW<w){
                if(park[moveH].substring(moveW,moveW+1).equals("X")){
                    break;
                }
                if(i==move-1){
                    startH=moveH;
                    startW=moveW;
                }
                }    
            }

        }


        int[] answer = {startH,startW};
        return answer;
    }
}