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
- 프록시
- SSAFY
- 플로이드 워셜
- 최단 경로
- 다익스트라
- 호스팅이란?
- 뮤텍스
- 세마포어와 뮤텍스
- 플로이드 와샬
- Dijkstra Algorithm
- Synchronization
- 서버 호스팅
- floyd-warshall
- 뮤텍스란?
- 클라우드 서버
- 웹 호스팅
- 세마포어
- 호스팅
- Proxy
- Proxy Server
- 싸피
- 프록시서버
- 싸피 면접 후기
- 다익스트라 알고리즘
- 삼성 청년 SW 아카데미
- 세마포어와 뮤텍스의 차이
- 싸피 합격
- 동기화
- 세마포어란?
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
[프로그래머스][Level3][Java] 경주로 건설 본문
programmers.co.kr/learn/courses/30/lessons/67259
문제풀이
해당 문제는 최단 경로 찾기 문제이기때문에 BFS로 풀면 되는 문제였다.
또한 항상 최소 비용을 가지고 있어야 되기때문에 비용을 저장하는 배열(priceMap)을 따로 선언하여 방문 체크 하는 배열 대신 활용 하였다. priceMap에는 항상 최소 비용을 가지고 있기 때문에 경로마다 자기 자신의 비용을 가지고 있고 방향마다 검사를 진행하여 그 방향에 위치한 배열값과 비교해서 값이 작다면 priceMap에 값을 갱신하고 Queue에 집어 넣어줘서 계속 진행하면 된다.
코드
import java.util.*;
class Solution {
public int solution(int[][] board) {
int answer = Integer.MAX_VALUE;
int N = board.length;
Queue<Pos> qu = new LinkedList<>();
int[][] priceMap = new int[N][N];
int[] dx = {0,0,-1,0,1};
int[] dy = {0,1,0,-1,0};
//각 지점 마다 최소값 가질 수 있도록 MAX_VALUE로 초기화
for(int i=0; i<N; i++) {
for(int j =0; j<N; j++) {
priceMap[i][j] = Integer.MAX_VALUE;
}
}
//출발 넣어주기 직진으로
qu.offer(new Pos(0,0,1,0));
qu.offer(new Pos(0,0,4,0));
while(!qu.isEmpty()){
int size = qu.size();
for(int i=0; i<size; i++){
Pos pos = qu.poll();
if(pos.x == N-1 && pos.y == N-1) continue;
for(int k=1; k<5; k++){
int x = pos.x + dx[k];
int y = pos.y + dy[k];
int dis = pos.dis;
int price = pos.price;
if(x<0 || x>=N || y<0 || y>=N || board[x][y] == 1) continue;
//진행한 방향과 같은지 검사
if((dis%2==0 && k%2 ==0)||(dis%2==1 && k%2 ==1)) {
//priceMap에 저장된 값보다 크다면 갈 필요 없는 길
if(priceMap[x][y] >= price+100) {
qu.offer(new Pos(x,y,k,price + 100));
priceMap[x][y] = price+100;
}
}
else {
//코너를 도는 순간 직진과 코너 값을 더 해준다.
if(priceMap[x][y] >= price+600) {
qu.offer(new Pos(x,y,k,price +600));
priceMap[x][y] = price+600;
}
}
}
}
}
return priceMap[N-1][N-1];
}
static class Pos{
int x;
int y;
int dis;
int price;
public Pos(int x, int y, int dis, int price){
this.x = x;
this.y = y;
this.dis = dis;
this.price = price;
}
}
}
'알고리즘 > 프로그래머스(Programmers)' 카테고리의 다른 글
[프로그래머스][Level3][자바] 입국심사 (0) | 2021.04.09 |
---|---|
[프로그래머스][Level2][Java] N개의 최소공배수 (0) | 2021.04.02 |
[프로그래머스][Level2][Java] 소수 만들기 (0) | 2021.01.04 |
[프로그래머스][Level2][Java] 짝지어 제거하기 (0) | 2021.01.04 |
[프로그래머스][Level2][Java] 영어 끝말잇기 (0) | 2021.01.02 |
Comments