Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Servlet
- 완도산회
- 고모네 콩탕
- 2839
- 설탕 배달
- 2020 KAKAO BLIND
- 투어
- mvc
- 스프링 MVC
- 2638
- 1로 만들기
- 백준
- dp
- 양꼬치
- 문자열 압축
- 다이나믹 프로그래밍
- 맛집
- Spring
- 2589
- 서블릿
- 알고리즘
- 동적 프로그래밍
- 프로그래머스
- BFS
- 맛집 투어
- 쓰레드 풀
- 포두부 보쌈
- HTTP API
- 스프링
- 호유동
Archives
- Today
- Total
프로그래밍 공방
[프로그래머스] 경주로 건설 본문
문제
programmers.co.kr/learn/courses/30/lessons/67259
문제해결방법
해당 칸 까지의 거리를 저장하는 배열을 가로로 도착했을 때와 세로로 도착했을 때 두 가지 경우로 나눠서 계산해주었다.
또 코너로 꺾이는 부분에서도 직선 도로는 생기므로 코너로 꺾는 부분에서는 600의 코스트를 더해주었다.
코드
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 72 | package Programmers; import java.util.ArrayDeque; import java.util.Queue; public class Solution_경주로건설 { public static int N; public static int[][] dir = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}}; public static int[][][] price; public static void bfs(int[][] board) { Queue<int[]> q = new ArrayDeque<int[]>(); q.add(new int[] {0, 0, 0}); q.add(new int[] {0, 0, 1}); price[0][0][0] = 0; price[0][0][1] = 0; while(!q.isEmpty()) { int[] cur = q.poll(); for(int d=0; d<dir.length; d++) { int nx = cur[0] + dir[d][0]; int ny = cur[1] + dir[d][1]; if(nx>=0 && nx<N && ny>=0 && ny<N && board[nx][ny]==0) { if(cur[2]==0) { // 가로 if(d<2) { // 가로 if(price[nx][ny][0]>price[cur[0]][cur[1]][0]+100) { price[nx][ny][0]=price[cur[0]][cur[1]][0]+100; q.add(new int[] {nx, ny, 0}); } } else { // 세로 if(price[nx][ny][1]>price[cur[0]][cur[1]][0]+600) { price[nx][ny][1]=price[cur[0]][cur[1]][0]+600; q.add(new int[] {nx, ny, 1}); } } } else { // 세로 if(d<2) { // 가로 if(price[nx][ny][0]>price[cur[0]][cur[1]][1]+600) { price[nx][ny][0]=price[cur[0]][cur[1]][1]+600; q.add(new int[] {nx, ny, 0}); } } else { // 세로 if(price[nx][ny][1]>price[cur[0]][cur[1]][1]+100) { price[nx][ny][1]=price[cur[0]][cur[1]][1]+100; q.add(new int[] {nx, ny, 1}); } } } } } } } public static int solution(int[][] board) { N = board.length; price = new int[N][N][2]; for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { price[i][j][0] = Integer.MAX_VALUE>>1; price[i][j][1] = Integer.MAX_VALUE>>1; } } bfs(board); int answer = Math.min(price[N-1][N-1][0], price[N-1][N-1][1]); return answer; } public static void main(String[] args) { int[][] board = {{0,0,0},{0,0,0},{0,0,0}}; System.out.println(solution(board)); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[백준] 2623번 : 음악 프로그램 (0) | 2021.03.01 |
---|---|
[프로그래머스] 징검다리 건너기 (0) | 2021.02.28 |
[프로그래머스] 카드 짝 맞추기 (0) | 2021.02.21 |
[백준] 19235번 : 모노미노도미노 (0) | 2021.02.21 |
[백준] 19236번 : 청소년 상어 (0) | 2021.02.19 |