📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• BFS + DP
4가지 방향에서 오는 방향 별 최소 비용을 저장하기 위해 방향까지 합친 3차원 배열을 사용하는 것이 포인트!
이 때, 단순 bfs로만 탐색하면 각 방향마다 달라지는 최소 비용을 지나칠 수 있으므로 dp (메모이제이션)을 사용한다.
- 4방향 탐색을 할 때, 처음 실행하거나 방향이 바뀌지 않은 경우에는 현재 비용에서 +100원만큼, 방향이 바뀐 경우에는 +600원만큼 이동하도록 한다. (방향 전환하느라 +500, 직진하느라 +100 한 번 더 하므로)
int nextCost = now.cost;
// 처음 실행하거나, 방향이 그대로인 경우
if(now.dir == -1 || now.dir == d) {
nextCost += 100;
}
else { // 방향이 변한 경우
nextCost += 600;
}
- 그리고 해당 방향으로 방문한 적 없고, 기존 금액 board[nr][nc] 보다 새로운 금액 nextCost 이 더 적은 경우, 격자의 칸을 방문 처리하고, 큐에 값을 추가하고, 칸의 값도 새로운 금액으로 채운다.
if(visited[nr][nc][d] == 0 || board[nr][nc] >= nextCost) {
q.add(new Node(nr, nc, d, nextCost));
visited[nr][nc][d] = 1;
board[nr][nc] = nextCost;
}
🔺 코드
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import java.util.*;
class Solution {
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static int N;
static int[][] board;
static int[][][] visited;
public int solution(int[][] board) {
this.board = board;
N = board.length;
visited = new int[N][N][4]; // 4방향에 대한 값 저장
return bfs();
}
private static int bfs() {
int answer = Integer.MAX_VALUE;
Queue<Node> q = new ArrayDeque<>();
q.add(new Node(0,0,-1,0));
while(!q.isEmpty()) {
Node now = q.poll();
// 도착점에 도달한 경우
if(now.r == N-1 && now.c == N-1) {
answer = Math.min(answer, now.cost);
}
for(int d = 0 ; d < 4 ; d++) {
int nr = now.r + dx[d];
int nc = now.c + dy[d];
if(nr < 0 || nr >= N || nc < 0 || nc >= N || board[nr][nc] == 1) continue;
int nextCost = now.cost;
// 처음 실행하거나, 방향이 그대로인 경우
if(now.dir == -1 || now.dir == d) {
nextCost += 100;
}
else { // 방향이 변한 경우
nextCost += 600;
}
// 해당 방향으로 방문한 적 없고, 기존 금액보다 새 금액이 더 적어서 이득인 경우 큐에 추가하기
if(visited[nr][nc][d] == 0 || board[nr][nc] >= nextCost) {
q.add(new Node(nr, nc, d, nextCost));
visited[nr][nc][d] = 1;
board[nr][nc] = nextCost;
}
}
}
return answer;
}
}
class Node {
int r, c, dir, cost;
public Node(int r, int c, int dir, int cost) {
this.r = r;
this.c = c;
this.dir = dir;
this.cost = cost;
}
}
|
cs |
➕ 다른 풀이 방식
우선순위 큐를 사용하신,,
프로그래머스 :: 경주로 건설 (Java)
도면의 상태(0은 비어 있음, 1은 벽)을 나타내는 2차원 배열 board가 매개변수로 주어질 때, 경주로를 건설하는데 필요한 최소 비용을 return 하도록 solution 함수를 완성해주세요.
velog.io
💦 어려웠던 점
- bfs로만 풀 생각을 해서 틀렸었다....
🧐 새로 알게 된 내용
- 3차원 배열을 활용해 4방향에서 오는 방향 별 최소 비용을 구하고, dp를 사용하는 아이디어!
- 더욱 작은 값을 가질 수 있다면, 그 값을 들고 다시 방문할 수도 있다고 한다.
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[카카오][BFS/DP][lv.3] 경주로 건설 - 자바(Java)
프로그래머스 > 코딩테스트 연습 > 2020 카카오 인턴십 > 경주로 건설 문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/67259 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭.
jie0025.tistory.com
[카카오 인턴] 경주로 건설 - JAVA
https://school.programmers.co.kr/learn/courses/30/lessons/67259 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는
yummy0102.tistory.com
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level1] [PCCE 기출문제] 10번 / 데이터 분석 (JAVA) (0) | 2024.05.16 |
---|---|
[프로그래머스/Level3] 스티커 모으기(2) (JAVA) (0) | 2024.05.16 |
[프로그래머스/Level3] 불량 사용자 (JAVA) (0) | 2024.05.13 |
[프로그래머스/Level 3] 아이템 줍기 (JAVA) (0) | 2024.04.23 |
[프로그래머스/Level2] [3차] 방금그곡 (JAVA) (0) | 2024.04.11 |