[Programmers] 공원 산책

2023. 8. 2. 13:14Computer Sciences/Problem Solve

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

 

프로그래머스

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

programmers.co.kr

문제 설명

단순 구현 문제로 주어진 조건대로 구현하면 해결할 수 있다. 특별히 설명할 건 없어 주석으로 처리하였다.

코드

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int h = park.length; // 세로 길이
        int w = park[0].length(); // 가로 길이
        int curRow = -1;
        int curCol = -1;
        
        // 맵을 감싸기 위해 +2 한 배열 생성
        int[][] tmpMap = new int[h + 2][w + 2];
        
        // 주어진 배열을 못 가는 길로 감싸 예외 처리를 단순화
        // 맵을 1로 테두리 처리
        setBoundary(tmpMap);
        
        // 맵 초기화
        for (int row = 1; row <= h; row++) {
            String line = park[row - 1];
            String[] tokens = line.split("");
            
            for (int col = 1; col <= w; col++) {
                String token = tokens[col - 1];
                /***
                 * O는 0으로 처리하고 배열은 기본적으로 0으로 초기화되므로
                 * O에 대한 처리 로직은 필요하지 않다.
                 ***/
                
                if (token.equals("S")) {
                    curRow = row;
                    curCol = col;
                    tmpMap[row][col] = 0;
                    continue;                    
                }

                if (token.equals("X")) {
                    tmpMap[row][col] = 1;
                    continue;
                }
            }
        }
        
        // 메인 로직
        for (String route : routes) {
            String[] info = route.split(" ");
            String direction = info[0];
            int distance = Integer.valueOf(info[1]);
            
            int tmpRow = curRow;
            int tmpCol = curCol;
            boolean canMove = true;

            for (int i = 1; i <= distance; i++) {
                switch (direction) {
                    case "E": tmpCol++; break;
                    case "W": tmpCol--; break;
                    case "S": tmpRow++; break;
                    case "N": tmpRow--; break;
                }
                
                if (tmpMap[tmpRow][tmpCol] == 1) {
                    canMove = false;
                    break;
                }
            }
            
            if (canMove) {
                curRow = tmpRow;
                curCol = tmpCol;
            }
        }
        
        return new int[] {curRow - 1, curCol - 1};
    }
    
    private void setBoundary(int[][] map) {
        // 0번째 컬럼 초기화
        for (int row = 0; row < map.length; row++) {
            map[row][0] = 1;
        }
        
        // n번째 컬럼 초기화
        for (int row = 0; row < map.length; row++) {
            map[row][map[0].length - 1] = 1;
        }
        
        // 0번째 로우 초기화
        for (int col = 0; col < map[0].length; col++) {
            map[0][col] = 1;
        }
        
        // m번째 로우 초기화
        for (int col = 0; col < map[0].length; col++) {
            map[map.length - 1][col] = 1;
        }
    }
}