어흥
[프로그래머스] 경주로 건설 (C++) 본문
728x90
반응형
문제 링크: programmers.co.kr/learn/courses/30/lessons/67259
1. 주의할 점
- BFS를 통해 해결한다
- Check[][][]를 통해 해당지점에 특정 방향에서 왔을때의 최소비용을 저장한다
- 코너가 생길 경우, 코너+직선이다
2. 구현
- Check[][][] 배열을 전부 MAX로 초기화한다
- BFS() 함수를 통해 조건 만족시 이동하도록 한다
- Check[y][x][dir]: (y,x)에 dir방향에서 접근했을 때 최소값
- 방향이 바뀔 경우, 코너 생성으로 비용은 코너+직선인 600이다
#define MAX 987654321
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
struct info{
int y,x,cost,dir;
};
info tmp;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
int arr[25][25];
int check[25][25][4];
int num,result=MAX;
void bfs(){
queue<info> q;
for(int i=0;i<4;i++){
q.push({0,0,0,i});
check[0][0][i]=0;
}
while(!q.empty()){
int cx = q.front().x;
int cy = q.front().y;
int cc = q.front().cost;
int cd = q.front().dir;
q.pop();
if(check[cy][cx][cd]!=cc) continue;
if(cy==num-1 && cx==num-1){
result = min(result,cc);
continue;
}
for(int i=0;i<4;i++){
int nx = cx+dx[i];
int ny = cy+dy[i];
if(nx>=0 && ny>=0 && nx<num && ny<num && arr[ny][nx]==0){
int nextCost=100; //직선
if(cd!=i) nextCost=600; //코너
if(check[ny][nx][i] > cc + nextCost){
check[ny][nx][i] = cc + nextCost;
q.push({ny,nx,cc + nextCost,i});
}
}
}
}
}
int solution(vector<vector<int>> board) {
int answer = 0;
num = board.size();
for(int i=0;i<num;i++)
for(int j=0;j<num;j++){
arr[i][j]=board[i][j];
for(int k=0;k<4;k++)
check[i][j][k]=MAX;
}
bfs();
return answer=result;
}
728x90
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 행렬 테두리 회전하기 (C++) (0) | 2021.05.03 |
---|---|
[프로그래머스] 로또의 최고 순위와 최저 순위 (C++) (0) | 2021.05.03 |
[프로그래머스] 보석 쇼핑 (C++) (0) | 2021.04.30 |
[프로그래머스] 수식 최대화 (C++) (0) | 2021.04.30 |
[프로그래머스] 여행경로 (C++) (0) | 2021.03.29 |
Comments