상세 컨텐츠

본문 제목

공원 산책 (연습문제)

프로그래머스 코딩테스트 풀이

by 발발개발 2023. 4. 28. 15:22

본문

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

 

프로그래머스

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

programmers.co.kr

 

풀이

class Solution {
    public int[] solution(String[] park, String[] routes) {
        char[][] parkMap = new char[park.length][park[0].length()];
        int startI = 0;
        int startJ = 0;

        for (int i = 0; i < park.length; i++) {
            for (int j = 0; j < park[i].length(); j++) {
                parkMap[i][j] = park[i].charAt(j);

                if (parkMap[i][j] == 'S') {
                    startI = i;
                    startJ = j;
                }
            }
        }

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

            if (isValid(parkMap, direction, length, startI, startJ)) {
                switch (direction) {
                    case "E":
                        startJ += length;
                        break;
                    case "W":
                        startJ -= length;
                        break;
                    case "S":
                        startI += length;
                        break;
                    case "N":
                        startI -= length;
                        break;
                    default:
                        return null;
                }
            }
        }

        return new int[]{startI, startJ};
    }

    public boolean isValid(char[][] parkMap, String direction, int length, int i, int j) {
        switch (direction) {
            case "E":
                if (j + length < 0 || j + length >= parkMap[0].length) {
                    return false;
                }

                while (length-- > 0) {
                    if (parkMap[i][++j] == 'X') {
                        return false;
                    }
                }
                break;
            case "W":
                if (j - length < 0 || j - length >= parkMap[0].length) {
                    return false;
                }

                while (length-- > 0) {
                    if (parkMap[i][--j] == 'X') {
                        return false;
                    }
                }
                break;
            case "S":
                if (i + length < 0 || i + length >= parkMap.length) {
                    return false;
                }

                while (length-- > 0) {
                    if (parkMap[++i][j] == 'X') {
                        return false;
                    }
                }
                break;
            case "N":
                if (i - length < 0 || i - length >= parkMap.length) {
                    return false;
                }

                while (length-- > 0) {
                    if (parkMap[--i][j] == 'X') {
                        return false;
                    }
                }
                break;
            default:
                return false;
        }

        return true;
    }
}

관련글 더보기

댓글 영역