반응형
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cmath>
using namespace std;
int map[26][26];
int mapTemp[26][26][4];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int n;
typedef struct
{
int x;
int y;
int money;
int px;
}node;
int bfs(int start)
{
queue<node>q;
q.push({ start,start,0,-1});
vector<int>result;
fill(&mapTemp[0][0][0], &mapTemp[n-1][n][4], 0); //배열0으로 초기화
while (!q.empty())
{
int qx = q.front().x; //x좌표
int qy = q.front().y; //y좌표
int qm = q.front().money; //현재 비용
int qpx = q.front().px; //이전 방향
q.pop();
if (qx == n - 1 && qy == n - 1) //목적지 도착하면 현재 비용 저장
{
result.push_back(qm);
continue;
}
for (int i = 0; i < 4; i++)
{
int mx = qx + dx[i];
int my = qy + dy[i];
int temp = qm;
if (mx<0 || mx>n-1|| my<0 || my>n-1)continue; //map을 벗어난 경우
if (map[mx][my] == 1)continue; //벽인 경우
if (qpx == -1 || qpx == i) //-1이거나 qpx가 현재방향과 동일한 경우 직선도로
temp += 100;
else if (qpx != i || qpx != -1 ) //그외의 경우 코너
temp += 600;
if(mapTemp[mx][my][i]>=temp || mapTemp[mx][my][i]==0) //현재 비용값이 mapTemp에 저장된 비용값보다 작거나 같은경우
{
mapTemp[mx][my][i] = temp;
q.push({mx,my,temp,i});
}
}
}
sort(result.begin(), result.end()); //오름차순 정렬
return result[0]; //가장 작은 값 반환
}
int solution(vector<vector<int>> board) {
int answer = 0;
for (int i = 0; i < board.size(); i++) //board를 map에 저장
for (int j = 0; j < board[i].size(); j++)
map[i][j] = board[i][j];
n = board.size();
int temp = bfs(0); //0부터 bfs탐색
answer = temp; //결과 저장
return answer;
}
후기
생각보다 시간이 오래걸렸다. 3차원배열을 사용하지 않고 탐색했을때 1개 또는 2개씩 계속 정답이 틀려서 조금만 수정하면 될줄알고 수정하다가 포기하고 다른사람들의 코드를 참고하며, 3차원배열을 써봤는데 바로 정답이 나왔다.
반응형
'Programming > Programmers' 카테고리의 다른 글
프로그래머스 1차다트게임 [c++] [2018카카오] (0) | 2022.04.19 |
---|---|
프로그래머스 타겟넘버 [c++] [stack] [level2] (0) | 2022.04.08 |
[프로그래머스] 여행경로 (c++) (dfs) (0) | 2022.03.30 |
[프로그래머스] 프린터 (c++) (스택/큐) (Level2) (0) | 2022.03.26 |
프로그래머스 소수찾기 [c++] (0) | 2022.03.23 |