학습/프로그래머스

[프로그래머스] 공원 산책(java)

태기 2023. 7. 7. 10:11

문제

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];

        // 시작 좌표 찾기
        for (int i = 0; i < park.length; i++) {
            int start = park[i].indexOf("S");
            if(start >= 0) {
                answer[0] = i;
                answer[1] = start;
                break;
            }
        }

        // 이동
        for (String route : routes) {
            String[] r = route.split(" ");
            String site = r[0];
            int moveIndex = Integer.parseInt(r[1]);
            int maxW = park[0].length();
            int maxH = park.length;
            boolean isOk = true;

            if (site.equals("E")) {
                if ((answer[1] + moveIndex) >= maxW) {  // 조건1 : 공원 벗어나는지 확인
                    continue;
                } else {    // 조건2 : 장애물을 만나는지 확인
                    String[] parkW = park[answer[0]].split("");
                    for (int i = answer[1]; i <= answer[1] + moveIndex; i++) {
                        if (parkW[i].equals("X")) {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk) {
                    answer[1] += moveIndex;
                }
            } else if (site.equals("W")) {
                if ((answer[1] - moveIndex) < 0) {
                    continue;
                } else {
                    String[] parkW = park[answer[0]].split("");
                    for (int i = answer[1]; i >= answer[1] - moveIndex; i--) {
                        if (parkW[i].equals("X")) {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk) {
                    answer[1] -= moveIndex;
                }
            } else if (site.equals("S")) {
                if ((answer[0] + moveIndex) >= maxH) {
                    continue;
                } else {
                    for (int i = answer[0]; i <= answer[0] + moveIndex; i++) {
                        if (park[i].substring(answer[1], answer[1] + 1).equals("X")) {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk) {
                    answer[0] += moveIndex;
                }
            } else if (site.equals("N")){
                if ((answer[0] - moveIndex) < 0) {
                    continue;
                } else {
                    for (int i = answer[0]; i >= answer[0] - moveIndex; i--) {
                        if (park[i].substring(answer[1], answer[1] + 1).equals("X")) {
                            isOk = false;
                            break;
                        }
                    }
                }
                if (isOk) {
                    answer[0] -= moveIndex;
                }
            }
        }

        return answer;
    }
}

각 방향마다 조건 체크해서 Ok가 되면 좌표 이동하도록 구현했다.

 

최악의 상황으로 시간복잡도가 O(n²)으로 구현되어있지만, 최소한으로 동작하도록 제약 조건을 많이 걸었다.