프로그래머스_공원 산책

LeeYulhee·2023년 8월 26일
0

💻 문제 출처 : 프로그래머스_공원 산책

👉 내가 작성한 답


class Solution {
    static int y = 0;
    static int x = 0;
    
    public int[] solution(String[] park, String[] routes) {
        
        for(int i = 0; i < park.length; i++) {
            int index = park[i].indexOf("S");
            if(index != -1) {
                x = index;
                y = i;
                break;
            }
        }
        
        for(String s : routes) {
            char direction = s.charAt(0);
            int distance = s.charAt(2) - '0';
            
            switch(direction) {
                case 'E' : x = checkX(park, distance); break;
                case 'W' : x = checkX(park, distance * - 1); break;
                case 'S' : y = checkY(park, distance); break;
                case 'N' : y = checkY(park, distance * - 1); break;
            }
        }
        
        return new int[]{y, x};
    }
    
    static public int checkX(String[] park, int distance) {
        
        if (x + distance >= park[0].length() || x + distance < 0) return x;
        
        for(int i = x; i != x + distance;) {

            int nextX = distance > 0 ? i + 1 : i - 1;
                
            if (park[y].charAt(nextX) == 'X') return x;
            
            i = distance > 0 ? ++i : --i;
        }
        
        return x + distance;
    }
    
    static public int checkY(String[] park, int distance) {
        
        if (y + distance >= park.length || y + distance < 0) return y;
        
        for(int i = y; i != y + distance;) {
            
            int nextY = distance > 0 ? i + 1 : i - 1;
            
            if (park[nextY].charAt(x) == 'X') return y;
            
            i = distance > 0 ? ++i : --i;
        }
        
        return y + distance;
    }
}

📌 문제 풀이 설명

  • 시작점인 S의 좌표 위치를 기억하는 int 변수 x와 y를 클래스 변수로 선언 및 0으로 초기화
  • for문으로 0부터 park의 길이 미만까지 1씩 증가하며 순회
    • int 변수 index를 선언하고 indexOf를 이용해 park[i]의 S index를 저장
    • 만약 index가 -1과 같지 않다면
      • x에 index를 대입
      • y에 i를 대입하고 break로 for문 종료
  • 향상된 for문으로 routes 요소를 순회
    • char 변수 direction에 routes 요소 첫 글자를 대입
    • int 변수 distance에 routes 요소 3번 째 글자에 - ‘0’을 해서 거리를 int로 대입
    • switch-case문으로 direction의 값에 따라 처리
      • case가 E인 경우 x에 checkX 메서드를 실행한 결과값을 대입
        • checkX 메서드
          • String 배열 park와 int distance를 매개변수로 받음
          • 만약 x + distance가 park 요소의 길이보다 크거나 같은 경우 혹은 x + distance가 0보다 작은 경우 return x
            • 0보다 작은 경우나 park 요소의 길이보다 크거나 작으면 park를 넘어가는 경우이기 때문에 실행하지 않은 현재 x 값을 return
          • for문으로 x부터 i가 x + distance랑 같지 않은 동안 순회
            • int nextX에 distance가 0보다 크면 i + 1을 대입, 작으면 i - 1을 대입
              • 다음 값이 - 방향인지 + 방향인지 판단
            • 만약 park[y]의 nextX번째 글자가 X와 같다면 원래의 x 값을 return
              • 같은 행의 다른 열의 글자들을 살펴봐야 하는 것이라 y는 고정하고 x를 변경하며 봐주는 것
            • i에 distance가 0보다 크면 1 증가, 작으면 1 감소해서 대입
          • for문이 종료되면 x + distance를 return
      • case가 W인 경우 checkX 메서드에 distance를 음수로 넣어 실행한 결과값을 x에 대입
      • case가 S인 경우 checkY를 실행한 값을 y에 대입
        • checkY 메서드
          • String 배열 park와 int distance를 매개변수로 받음
          • 만약 y + distance가 park의 길이보다 크거나 같은 경우 혹은 y + distance가 0보다 작은 경우 return y
          • for문으로 y부터 i가 y + distance랑 같지 않은 동안 순회
            • int nextY에 distance가 0보다 크면 i + 1을 대입, 작으면 i - 1을 대입
            • 다음 값이 - 방향인지 + 방향인지 판단
            • 만약 park[nextY]의 x번째 글자가 X와 같다면 원래의 y 값을 return
              • 같은 열의 다른 행의 글자들을 살펴봐야 하는 것이라 x는 고정하고 y를 변경하며 봐주는 것
            • i에 distance가 0보다 크면 1 증가, 작으면 1 감소해서 대입
          • for문이 종료되면 y + distance를 return
      • case가 N인 경우 checkY에 distance를 음수로 넣어 나온 결과값을 y에 대입
  • for문이 종료되면 int 배열을 생성해 y와 x를 넣고 return
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글