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

Yujin·2025년 6월 19일

CodingTest

목록 보기
43/51

문제

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


접근 방식

  1. 좌표계를 11x11 크기로 설정, 중앙인 (5,5)에서 시작
  2. 각 명령어를 순서대로 처리하면서 새로운 좌표 (nr, nc)를 계산
  3. 계산된 좌표가 보드 범위를 벗어나지 않는지 확인한 후, 유효한 범위 내에 있을 때만 이동을 수행
  4. 이동하려는 좌표가 이전에 방문한 적이 없는 경로인지를 확인
  5. 경로는 양방향이므로, 반대방향에서 오는 경우도 방문 처리
    1. 위 ↔ 아래, 왼↔오
      1. 짝수 방향 (UD)는 2 - d 2- 0 = 2, 2 - 2 = 0
      2. 홀수 방향 (LR)은 4 - d 4 - 1 = 3, 4 - 3 = 1
  6. 새로운 경로일 경우, answer 값을 증가시키고, 방문 기록을 남김

나의 코드

class Solution {
    
    static int dr[] = {-1, 0, 1, 0};  // 행(row) 이동 방향
    static int dc[] = {0, -1, 0, 1};  // 열(column) 이동 방향
    
    public int solution(String dirs) {
        int answer = 0; 
        int map[][] = new int[11][11]; 
        boolean visit[][][] = new boolean[11][11][4]; // 방문 여부 [행][열][방향]
        
        // 시작 좌표 (5, 5)
        int r = 5; 
        int c = 5;
        
        for (int i = 0; i < dirs.length(); i++) {
            // 처리할 명령어를 하나씩 가져옴
            char cc = dirs.charAt(i);
            
            int d = 0; // 이동 방향을 저장할 변수
            if (cc == 'U') // 위
                d = 0;
            if (cc == 'L') // 왼쪽
                d = 1;
            if (cc == 'D') // 아래
                d = 2;
            if (cc == 'R') // 오른쪽
                d = 3;
            
            // 새로운 좌표
            int nr = r + dr[d];
            int nc = c + dc[d];
            
            // 범위 밖으로 나가면
            if (nr < 0 || nc < 0 || nr >= 11 || nc >= 11)
                continue;
            
            // 방문하지 않았다면
            if (!visit[nr][nc][d]) {
                // 방문처리
                visit[nr][nc][d] = true;
                
                // 반대 방향에도 방문처리
                // 짝수라면 -> 위 아래, 홀수라면 -> 왼 오
                d = (d % 2 == 0) ? 2 - d : 4 - d;
                visit[r][c][d] = true;
                
                // 새로운 경로, answer 증가
                answer++;
            }
            
            // 좌표 갱신
            r = nr;
            c = nc;
        }
        return answer;
    }
}

0개의 댓글