프로그래머스 코딩 테스트 문제/lv2

프로래머스 Lv2 빛의 경로 사이클 문제

lys4321 2026. 2. 24. 02:06
  • 프로래머스 Lv2 빛의 경로 사이클 문제
    • 해당 문제의 난이도 상승 원인
      • y, x 축을 순환하면서 직접 경로를 이동하면서 계산하는 방식을 사용하려 했기 때문에 쓸데없는 동작과 기타 계산이 들어가 난이도를 더욱
    • 직접 경로를 이동하는 방식에서 변경한 방식
      • 노드 당 방향을 상징하는 boolean 배열과 x/y축에 대한 상하, 좌우 가중치 배열을 생성하여 직접 경로를 이동하는 방식이 아닌, 방향만 고려해 상태를 변경해 검사하는 방식을 사용
    • 문제의 핵심
      • 이 문제의 주제는 '빛의 경로'를 게산하는 문제이기 때문에 경로가 아닌 상태를 이용해 해결해야 한다.
    • 이 문제의 목적
      • '경로'라는 단어 때문에 직접 경로를 이동하는 것이 아닌, '방향'의 상태만을 이용해 문제를 해결해야 한다.
      • 방향의 상태 값을 이용하여 간접적으로 경로를 계산하려는 생각을 가지도록 한다.
package LightPathCycle;

import java.util.*;
class LightPathCycle {
    public int[] solution(String[] grid) {
        int gly = grid.length;
        int glx = grid[0].length();
        int al = 4;

        boolean[][][] direct = new boolean[gly][glx][al];
        int[] arrowY = { -1, 0, 1, 0 };
        int[] arrowX = { 0, 1, 0, -1 };

        List<Integer> cntList = new ArrayList<>();

        for(int y = 0; y < gly; y++){
            for(int x = 0; x < glx; x++){
                for(int i = 0; i < al; i++){
                    if (direct[y][x][i]) continue;

                    int cy = y;
                    int cx = x;
                    int ci = i;
                    int cnt = 0;

                    while(!direct[cy][cx][ci]){
                        direct[cy][cx][ci] = true;

                        char w = grid[cy].charAt(cx);
                        int weight =
                                (w == 'L') ? 3 :
                                        (w == 'R') ? 1 : 0;
                        ci = (ci + weight + al) % al;
                        cy = (cy + arrowY[ci] + gly) % gly;
                        cx = (cx + arrowX[ci] + glx) % glx;
                        cnt += 1;
                    }
                    if(cnt > 0){
                        cntList.add(cnt);
                    }
                }
            }
        }


        int[] answer = cntList.stream().sorted().mapToInt(Integer::intValue).toArray();
        return answer;
    }

    public static void main(String[] args) {
        String[] grid = {"SL", "LR"};

        LightPathCycle lpc = new LightPathCycle();

        System.out.println("결과 : " + Arrays.toString(lpc.solution(grid)));

    }
}