ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 프로그래머스 1단계 - 공원 산책
    Algorithm 2024. 4. 30. 09:40

     

    프로그래머스 문제 링크

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

     

    문제 설명

    이 문제는 강아지 로봇이 최종적으로 이동한 위치를 결과로 리턴해주는 문제다

    park배열에서 'S'가 시작 위치이며 O는 이동할 수있는 길이고 X는 장애물을 의미하며 routes의 이동거리에 장애물이 포함되면 이동 자체가 취소 된다. E,W,S,N은 동서남북을 의미하고 한칸 띄고 이동칸의 수가 적혀있다. 장애물과 마찬가지로 park 배열의 범위를 벗어나면 그 이동 또한 취소로 간주된다.

     

    예시

    park

    ["SOO","OOO","OOO"]

     

    routes

    ["E 2","S 2","W 1"]

     

    result
    [2,1]

     

    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Solution {
    
        public static void main(String[] args) throws Exception {
            Solution solution = new Solution();
            // 함수 호출 테스트
            int[] solution1 = solution.solution(new String[]{"SOO","OOO","OOO"}, new String[]{"E 2", "S 2", "W 1"});
            // x좌표
            System.out.println(solution1[0]);
            // y좌표
            System.out.println(solution1[1]);
        }
        
        // 큐에 routes를 담기 위한 리스트
        static Queue<Position> positionQueue = new LinkedList<>();
        
        // 현재 위치 배열
        static int[] currentPos = new int[2]; // x, y 위치 순서
    
        public int[] solution(String[] park, String[] routes) throws Exception {
        	
            // 시작 위치를 찾는다.
            for (int i = 0; i < park.length; i++) {
                int xPosition = park[i].indexOf('S');
                if (xPosition != -1) {
                    currentPos[0] = xPosition; // x 좌표
                    currentPos[1] = i; // y 좌표
                    break;
                }
            }
            
    	// 큐에 routes에서 파싱한 정보를 담는다.
            for (String route : routes) {
                positionQueue.offer(new Position(route.charAt(0), route.charAt(2) - '0', park));
            }
    		
            // 큐를 전부 소비할때까지 반복문 진행
            while (!positionQueue.isEmpty()) {
                Position position = positionQueue.poll();
                // 위치 변환 메서드로 현재 위치 업데이트
                currentPos = position.changePosition(currentPos);
            }
    
            return new int[] {currentPos[1], currentPos[0]};
        }
    
    	// 위치 클래스
        static class Position {
        	// 방향 지정
            Direction direction;
            // 총 이동 거리
            int totalMoves;
            // 제거하고 메서드에 인수로 받아서 사용해도 된다.
            String[] parks;
    
            public Position(char direction, int totalMoves, String[] parks) throws Exception {
                this.direction = Direction.valueOfLabel(direction);
                this.totalMoves = totalMoves;
                this.parks = parks;
            }
    
    	// 자바는 원시형 인자의 경우 call by value기 때문에 값만 복사해서 메서드 인자를 사용하여
            // 외부의 값을 받은경우 메서드 내부에서 수정해도 수정이 되지않는다.
            // 리턴시 정확히 값을 지정해야한다.
            public int[] changePosition(int[] currentPosition) {
            	// 장애물이나 park를 벗어나는 경우는 이동자체가 취소되기 때문에 새로운 임시배열 선언하여
                // 이동이 성공적으로 끝나면 임시배열을 리턴하고 취소된경우는 기존 배열 리턴
                int[] tmpPos = new int[2];
                tmpPos[0] = currentPosition[0];
                tmpPos[1] = currentPosition[1];
    
                for (int i = 0; i < totalMoves; i++) {
                    tmpPos[0] = tmpPos[0] + direction.dx;
                    tmpPos[1] = tmpPos[1] + direction.dy;
    
                    if (tmpPos[0] < 0 || tmpPos[0] >= parks[0].length() || tmpPos[1] < 0 || tmpPos[1] >= parks.length || parks[tmpPos[1]].charAt(tmpPos[0]) == 'X') {
                        break;
                    }
    
                    if (i + 1 == totalMoves) {
                        return tmpPos;
                    }
                }
                return currentPosition;
            }
        }
    
    // enum 형태로 동서남북을 정의한다.
        enum Direction {
            NORTH('N', 0, -1), SOUTH('S', 0, 1), EAST('E', 1, 0), WEST('W', -1, 0);
    
            final char label;
            final int dx;
            final int dy;
    
            Direction(char label, int dx, int dy) {
                this.label = label;
                this.dx = dx;
                this.dy = dy;
            }
    
            public static Direction valueOfLabel(char label) {
                for (Direction direction : values()) {
                    if (direction.label == label) {
                        return direction;
                    }
                }
                return null;
            }
        }
    
    }

    댓글

Designed by Tistory.