📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 구현
1. 방문 배열과 상하좌우 배열 선언
- 3차원 방문 배열 : (행, 열, 빛을 쏜 방향) 저장
- 상하좌우 배열 : [아래, 왼쪽, 위, 오른쪽] 순서로 저장 (방향 전환 쉽게 하기 위해)
2. 좌회전과 우회전
d = (d+3) % 4; // 좌회전
d = (d+1) % 4; // 우회전
3. 빛 쏘고 다음에 도착하는 점에 대한 행과 열 재할당
i = (i + dx[d] + r) % r; // 행
j = (j + dy[d] + c) % c; // 열
💥 유의사항
어느 곳에서 빛을 쏘든 간 빛은 무조건 순환되고, 이 때 순환된 빛의 사이클을 구하자.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import java.util.*;
class Solution {
static int[] dx = {-1, 0, 1, 0}; // 아래-왼-위-오른쪽
static int[] dy = {0, -1, 0, 1};
static String[] grid;
static int r, c;
static boolean[][][] visited; // 행, 열, 빛을 쏜 방향
static List<Integer> ans = new ArrayList<>();
public int[] solution(String[] grid) {
this.grid = grid;
r = grid.length;
c = grid[0].length();
visited = new boolean[r][c][4];
// 모든 정점에서 4가지 방향으로 빛 쏘기
for(int i = 0 ; i < r ; i++) {
for(int j = 0 ; j < c ; j++) {
for(int d = 0 ; d < 4 ; d++) {
if(!visited[i][j][d])
ans.add(light(i, j, d));
}
}
}
Collections.sort(ans); // 사이클 오름차순 정렬
int[] answer = new int[ans.size()];
for(int i = 0 ; i < answer.length ; i++)
answer[i] = ans.get(i);
return answer;
}
private static int light(int i, int j, int d) {
int cnt = 0; // 만들어지는 사이클
while(!visited[i][j][d]) {
cnt++; // 한 번 반복할 때마다 빛의 경로 이동
visited[i][j][d] = true; // 빛 쏜 정점, 방향 방문 처리
// 좌회전과 우회전
if(grid[i].charAt(j) == 'L')
d = (d+3) % 4;
if(grid[i].charAt(j) == 'R')
d = (d+1) % 4;
// 빛 쏘고 다음에 도착하는 행과 열 재할당
i = (i + dx[d] + r) % r;
j = (j + dy[d] + c) % c;
}
return cnt;
}
}
|
cs |
💦 어려웠던 점
- 4개 방향에 대한 방문 여부 확인
🧐 새로 알게 된 내용
- 4방향 처리는 3차원으로!
- 사이클이 겹치면 안되니까 방문 배열 사용하기!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[level2] 프로그래머스 - 빛의 경로 사이클(JAVA)
문제가 잘 이해가지 않아서, 질문하기에 문제 설명 보고나서 풀었다ㅠ [ 문제 풀이 ] - grid의 각 정점이 4방향 [상, 하, 좌, 우]로 들렸는지 여부를 저장할 3차 배열을 만들어준다. - 방향(d)의 순서
jisunshine.tistory.com
[JAVA] 프로그래머스 - 빛의 경로 사이클 - Lv2
문제 내용 https://programmers.co.kr/learn/courses/30/lessons/86052 코딩테스트 연습 - 빛의 경로 사이클 각 칸마다 S, L, 또는 R가 써져 있는 격자가 있습니다. 당신은 이 격자에서 빛을 쏘고자 합니다. 이 격자
record-developer.tistory.com
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level3] 숫자 게임 (JAVA) (1) | 2024.03.04 |
---|---|
[프로그래머스/Level2] 순위 검색(JAVA) (0) | 2024.03.03 |
[프로그래머스/Level2] 수식 최대화 (JAVA) (0) | 2024.02.29 |
[프로그래머스/Level2] 마법의 엘리베이터 (JAVA) (0) | 2024.02.26 |
[프로그래머스/Level2] [3차] n진수 게임 (JAVA) (0) | 2024.02.26 |