본문 바로가기

Archived(CSE Programming)/알고리즘(Java)

프로그래머스 - 방문길이(Java, LV3)

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

 

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

 

programmers.co.kr

풀이

 

시뮬레이션 문제로 전체 시뮬레이션 대상의 크기는 크지 않지만 조건들을 놓치기 쉬운 부분이 있는 문제였다.

2차원 배열로 방문했는지 안했는지 체크 -> X
3차원 배열로 해당 지점에 방문할 때 어느 방향에서 와서 방문한 길인지 체크 -> O

방문한 길이라고 했기 때문에 새로 방문했을 경우만 길이를 체크하는 것이 아니라 한 지점에 대해 4방의 길이를 생성할 수 있기에 그 부분을 주의해야 한다.

 

추가적으로

4방의 길이를 체크함에 있어 기존위치 -> 신규위치로 변할때
존위치의 U 방향과 신규의치의 D 방향은 결국 같은 길 인점을 주의해야한다.

예를 들어, UDU를 수행함에 있어 아래와 같이 왔던 길이기에 1만 카운트되야 한다.

UDU 가 카운트 1만되는 예시

 

import java.util.*;

class Solution {
    public int solution(String dirs) {        
        int answer = 0;
        // 3차원 배열 끝 행 UDRL 방향길
        int[][][] graph = new int[11][11][4];
        
        int[] dx = {-1, 1, 0, 0}; // UDRL
        int[] dy = {0, 0, 1, -1}; // UDRL
        
        // now , next
        int x = 5;
        int y = 5; 
        int nx = 0, ny= 0;
        // 명령어 처리
        for(int i=0; i<dirs.length();i++){
            char chr = dirs.charAt(i);
            
            // U
            if (chr == 'U'){
                // 가능
                if(x+dx[0]>= 0 && x+dx[0]<=10  && y+dy[0] >=0 && y+dy[0] <=10){
                    nx = x+dx[0];
                    ny = y+dy[0];
                    // 기존 위치 U 안만들었고, 새로운 위치 D 안만들었으면
                    if(graph[x][y][0] == 0 && graph[nx][ny][1] ==0){
                        answer++;
                        graph[x][y][0] = 1;
                        graph[nx][ny][1] = 1;
                    }
                    x = nx; y = ny;
                } 
            }

            // D
            else if(chr == 'D'){
                // 가능
                if(x+dx[1]>= 0 && x+dx[1]<=10  && y+dy[1] >=0 && y+dy[1] <=10){
                    nx = x+dx[1];
                    ny = y+dy[1];
                    // 기존 위치 D 안만들었고, 새로운 위치 U 안만들었으면
                    if(graph[x][y][1] == 0 && graph[nx][ny][0] ==0){
                        answer++;
                        graph[x][y][1] = 1;
                        graph[nx][ny][0] = 1;
                    }
                    x = nx; y = ny;
                }   
            }
            
            // R
            else if(chr == 'R'){
                // 가능
                if(x+dx[2]>= 0 && x+dx[2]<=10  && y+dy[2] >=0 && y+dy[2] <=10){
                    nx = x+dx[2];
                    ny = y+dy[2];
                    // 기존 위치 R 안만들었고, 새로운 위치 L 안만들었으면
                    if(graph[x][y][2] == 0 && graph[nx][ny][3] ==0){
                        answer++;
                        graph[x][y][2] = 1;
                        graph[nx][ny][3] = 1;
                    }
                    x = nx; y = ny;
                }   
            }
            
            // L
            else if(chr == 'L'){
                // 가능
                if(x+dx[3]>= 0 && x+dx[3]<=10  && y+dy[3] >=0 && y+dy[3] <=10){
                    nx = x+dx[3];
                    ny = y+dy[3];
                    // 기존 위치 L 안만들었고, 새로운 위치 R 안만들었으면
                    if(graph[x][y][3] == 0 && graph[nx][ny][2] ==0){
                        answer++;
                        graph[x][y][3] = 1;
                        graph[nx][ny][2] = 1;
                    }
                    x = nx; y = ny;
                }   
            }
            
        }
        
        return answer;
    }
}