본문 바로가기

Algorithm/프로그래머스

[프로그래머스] 방문 길이

https://programmers.co.kr/learn/courses/30/lessons/49994

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

구현 실수만 하지 않는다면 쉽게 풀리지 않을까 싶다.

나는 지나간 길을 visited 배열에 마킹하는 방식으로 풀었는데 HashSet으로 풀어도 될 듯 하다.

좌표평면의 한 칸이 아니라 모서리를 저장해야 하므로

이런 식으로 윗면과 옆면을 따로 저장하기 위해 3차원 배열로 선언했다.

 

class Solution {
    public int solution(String dirs) {
        int answer = 0;

        // 순서대로 UDLR
        // visited에 기록하기 위한 배열
        int[] x1 = {-1, 0, 0, 0};
        int[] y1 = {0, 0, -1, 0};
        // 현재 위치 변경하기 위한 배열
        int[] x2 = {-1, 1, 0, 0};
        int[] y2 = {0, 0, -1, 1};

        boolean[][][] visited = new boolean[2][11][11];
        
        // 현재 위치를 저장
        int x = 5;
        int y = 5;

        for (char a : dirs.toCharArray()) {
            int dir = 0;
            switch(a) {
                case 'U': dir = 0; break;
                case 'D': dir = 1; break;
                case 'L': dir = 2; break;
                case 'R': dir = 3; break;
            }

            int newX = x + x2[dir];
            int newY = y + y2[dir];
            if (newX < 0 || newX >= 11 || newY < 0 || newY >= 11) continue;

            if (dir <= 1) {
                if (!visited[1][x + x1[dir]][y + y1[dir]]) {
                    answer++;
                    visited[1][x + x1[dir]][y + y1[dir]] = true;
                }
            }
            else {
                if (!visited[0][x + x1[dir]][y + y1[dir]]) {
                    answer++;
                    visited[0][x + x1[dir]][y + y1[dir]] = true;
                }
            }

            x = newX;
            y = newY;
        }

        return answer;
    }
}