코딩테스트/프로그래머스

[프로그래머스]방문 길이 - Java (3차원 배열, 방향 벡터 사용 풀이)

GAEBAL 2022. 8. 2. 21:56
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

앞에 올렸던 글과 같은 문제지만 다른 풀이임

이 방법이 더 빠르고 효율이 좋아서 이 풀이도 올리게 됐음 ㅎㅎㅎ

 

visited 배열을 2차원이 아닌 2차원 + 4방향. 즉, 3차원 배열로 만들어서 방문 체크를 해주는 방법임
방향 벡터 dr[]과 dc[]의 방향을 정할 때 시계 방향이나 반시계 방향으로 정해줘야 방향을 정반대로 바꿀 때 이렇게 밑에 처럼 해줄 수 있기 때문에 편함
d = (d + 2) % 4; // 방향을 정반대로 바꿔줌
암튼 다음 위치로 이동할 수 있는지 확인한 후에 다음 위치 + 방향에 방문 체크 해주고, 현재 위치 + 반대 방향에도 방문 체크 해주면 됨 !!

 

자세한건 주석으로 !

 

 

코드

// 코딩테스트 연습 - Summer/Winter Coding(~2018) - 방문 길이
// https://school.programmers.co.kr/learn/courses/30/lessons/49994

package PROGRAMMERS.level2;


public class Num49994_방문길이_방향벡터풀이 {
    private static class Solution {
        // 반시계 방향
        static int dr[] = {-1, 0, 1, 0};
        static int dc[] = {0, -1, 0, 1};

        private int solution(String dirs) {
            int answer = 0;

            boolean[][][] visited = new boolean[11][11][4]; // [11][11][4방향]

            int r = 5, c = 5; // 중앙에서 시작

            for (int i = 0; i < dirs.length(); i++) {
                char temp = dirs.charAt(i);
                int d = 0; // 방향

                if (temp == 'U') {
                    d = 0;
                } else if (temp == 'L') {
                    d = 1;
                } else if (temp == 'D') {
                    d = 2;
                } else if (temp == 'R') {
                    d = 3;
                }

                int nr = r + dr[d];
                int nc = c + dc[d];

                // 범위 밖으로 나가면 continue
                if (nr < 0 || nr >= 11 || nc < 0 || nc >= 11) {
                    continue;
                }

                // 가려고 하는 길이 가보지 않은 길이라면
                if (!visited[nr][nc][d]) {
                    visited[nr][nc][d] = true; // 방문 체크
                    d = (d % 2 == 0) ? 2 - d : 4 - d; // 방향을 정반대로 바꿔줌
                    visited[r][c][d] = true; // 방문 체크
                    answer++;
                }

                // 현재 위치 이동
                r = nr;
                c = nc;
            }

            return answer;
        }

        public static void main(String[] args) {
            Solution sol = new Solution();

            System.out.println(sol.solution("ULURRDLLU"));
            System.out.println(sol.solution("LULLLLLLU"));
            System.out.println(sol.solution("UDU"));
        }
    }
}
728x90