각 칸마다 S, L, 또는 R가 써져 있는 격자가 있습니다. 당신은 이 격자에서 빛을 쏘고자 합니다. 이 격자의 각 칸에는 다음과 같은 특이한 성질이 있습니다.
당신은 이 격자 내에서 빛이 이동할 수 있는 경로 사이클이 몇 개 있고, 각 사이클의 길이가 얼마인지 알고 싶습니다. 경로 사이클이란, 빛이 이동하는 순환 경로를 의미합니다.
예를 들어, 다음 그림은 격자 ["SL","LR"]에서 1행 1열에서 2행 1열 방향으로 빛을 쏠 경우, 해당 빛이 이동하는 경로 사이클을 표현한 것입니다.
이 격자에는 길이가 16인 사이클 1개가 있으며, 다른 사이클은 존재하지 않습니다.
격자의 정보를 나타내는 1차원 문자열 배열 grid가 매개변수로 주어집니다. 주어진 격자를 통해 만들어지는 빛의 경로 사이클의 모든 길이들을 배열에 담아 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해주세요.
import java.util.ArrayList;
class Solution {
static int R, C;
static int[] dr = { -1, 0, 1, 0 }, dc = { 0, -1, 0, 1 }; // 아래, 왼, 위, 오른
static boolean[][][] isVisited;
public int[] solution(String[] grid) {
ArrayList<Integer> answer = new ArrayList<Integer>();
R = grid.length;
C = grid[0].length();
isVisited = new boolean[R][C][4];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
for (int d = 0; d < 4; d++) {
if (!isVisited[i][j][d])
answer.add(light(grid, i, j, d ));
}
}
}
return answer.stream().sorted().mapToInt(i -> i).toArray();
}
private static int light(String[] grid, int r, int c, int d) {
int cnt = 0; // 이동거리
while (true) {
if (isVisited[r][c][d])
break;
cnt++; // 거리증가
isVisited[r][c][d] = true; // 방문처리
if (grid[r].charAt(c) == 'L')
d = d == 0 ? 3 : d - 1; // 좌회전
else if (grid[r].charAt(c) == 'R')
d = d == 3 ? 0 : d + 1; // 우회전
r = (r + dr[d] + R) % R;
c = (c + dc[d] + C) % C;
}
return cnt;
}
}
느낀점
ㅎㅎ 몸상태 그지다
2022년 4월 12일 - 튜플 lv2 (0) | 2022.04.20 |
---|---|
2022년 4월 11일 - java 8 공부 (1) (Lambda Expression & Method Reference) (0) | 2022.04.20 |
2022년 4월 8일 - 자물쇠와 열쇠 lv3 (0) | 2022.04.20 |
2022년 4월 4일 - 삼각 달팽이 lv2, 스킬트리 lv2 (0) | 2022.04.20 |
2022년 4월 1일 - 해시(1차) lv2 (0) | 2022.04.20 |
댓글 영역