개발 창고/Algorithm

[프로그래머스] 공원 산책 - JAVA

로이제로 2024. 1. 31. 23:41
반응형


문제

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

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

programmers.co.kr

문제 내용은 지적 재산 보호 차원에서 가져오지 않고 풀이만 공유드리도록 하겠습니다.


풀이

 제 풀이가 무조건적으로 맞는 것도 최적의 답변도 아니지만, 이런 풀이도 있다는 차원에서 작성해 보며, 좀 더 나은 방법이 있다면 이야기해 주셔도 도움 될 것 같습니다.

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        
        // Step. 시작 위치와 장애물 x좌표와 y좌표 기준으로 체크위치 체크
        int stX     = 0;    // 시작 x좌표
        int stY     = 0;    // 시작 y좌표
        int maxX    = park[0].length() - 1;
        int maxY    = park.length - 1;
        String[] parkX = park;                  // 가로 방향 동선 (EAST, WEST)
        String[] parkY = new String[maxX + 1];  // 세로 방향 동선 (NORTH, SOUTH)
        for(int i = 0; i <= maxY; i++){
            String line = park[i];
            for(int j = 0; j <= maxX; j++){
                char point = line.charAt(j);
                if(point == 'S'){
                    stX = j;
                    stY = i;
                }
                
                if(parkY[j] == null)  parkY[j] = "";
                parkY[j] += point;
            }
        }
        
        // System.out.println(String.join(", ", parkX));
        // System.out.println(String.join(", ", parkY));
        
        // Step. 산책 시작
        int moveX = stX;
        int moveY = stY;
        for(String route:routes){
            String op   = route.split(" ")[0];
            int n       = Integer.valueOf(route.split(" ")[1]);
            // System.out.println(moveX + ", " + moveY);
            
            // Step. 동쪽으로 이동하는 경우
            if(op.equals("E")){
                int sIdx = moveX;
                int eIdx = moveX + n;
                if(eIdx > maxX) eIdx = maxX;
                
                // System.out.println(n + " : " + parkX[moveY].substring(sIdx, eIdx + 1));
                
                // Step. 중간에 장애물이 있는지 체크
                int blockIdx = parkX[moveY].substring(sIdx, eIdx + 1).indexOf("X");
                // Step. 장애물이 없거나 공원을 벗어나지 않는 경우
                if(blockIdx < 0 && moveX + n <= maxX)  moveX = eIdx;
            // Step. 서쪽으로 이동하는 경우
            }else if(op.equals("W")){
                int sIdx = 0;
                int eIdx = moveX;
                if(moveX > n)   sIdx = moveX - n;
                
                // System.out.println(n + " : " + parkX[moveY].substring(sIdx, eIdx + 1));
                
                // Step. 중간에 장애물이 있는지 체크
                int blockIdx = parkX[moveY].substring(sIdx, eIdx + 1).lastIndexOf("X");
                // Step. 장애물이 없거나 공원을 벗어나지 않는 경우
                if(blockIdx < 0 && moveX - n >= 0)     moveX = sIdx;
            
            // Step. 남쪽으로 이동하는 경우
            }else if(op.equals("S")){
                int sIdx = moveY;
                int eIdx = moveY + n;
                if(eIdx > maxY) eIdx = maxY;
                
                // System.out.println(n + " : " + parkY[moveX].substring(sIdx, eIdx + 1));
                
                // Step. 중간에 장애물이 있는지 체크
                int blockIdx = parkY[moveX].substring(sIdx, eIdx + 1).indexOf("X");
                // Step. 장애물이 없거나 공원을 벗어나지 않는 경우
                if(blockIdx < 0 && moveY + n <= maxY)  moveY = eIdx;
            
            // Step. 북쪽으로 이동하는 경우
            }else if(op.equals("N")){
                int sIdx = 0;
                int eIdx = moveY;
                if(moveY > n)   sIdx = moveY - n;
                
                // System.out.println(n + " : " + parkY[moveX].substring(sIdx, eIdx + 1));
                
                // Step. 중간에 장애물이 있는지 체크
                int blockIdx = parkY[moveX].substring(sIdx, eIdx + 1).lastIndexOf("X");
                // Step. 장애물이 없거나 공원을 벗어나지 않는 경우
                if(blockIdx < 0 && moveY - n >= 0) moveY = sIdx;
            }
        }
        
        // System.out.println("[" + moveY + ", " + moveX + "]");
        answer[0] = moveY;
        answer[1] = moveX;
        return answer;
    }
}

코드 실행 결과
제출 결과

반응형