- 프로래머스 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)));
}
}