Hello Ocean! ๐ŸŒผ

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ) ๋ณธ๋ฌธ

Algorithm

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ)

bba_dda 2022. 1. 18. 00:13
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/67259

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค

[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[

programmers.co.kr

๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜์ž๋ฉด,

์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ board์—์„œ

(0, 0)์—์„œ (N-1, N-1)๊นŒ์ง€ ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š”๋ฐ

์ง์„ ๋„๋กœ๋Š” ํ•œ ์นธ์— 100์›, ์ฝ”๋„ˆ๋Š” 100+500 = 600์› ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ, (0, 0)์—์„œ (N-1, N-1)๊นŒ์ง€ ๋„๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

ํ’€์ด

board์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 25x25์ด๋‹ค. -> ์—„์ฒญ ํฌ์ง€ ์•Š์Œ -> ์‹œ๊ฐ„๋ณต์žก๋„ ๋„๋„ 

๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์ธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ฐพ๊ธฐ์— ๋งŽ์ด ์“ฐ์ด๋Š” BFS๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

visited[r][c] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์— [0][0] ~ [r][c] ๊นŒ์ง€์˜ ์ตœ์†Œ๋น„์šฉ์„ ์ €์žฅํ–ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ , Queue์— { r, c, cost, flag(๋ฐฉํ–ฅ์ •๋ณด) }๋ฅผ ๋‹ด์•˜๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ! visited๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ด์šฉํ–ˆ๋”๋‹ˆ ํ…Œ์ผ€ 25๋ฒˆ๋งŒ ํ‹€๋ฆฌ๊ฒŒ ๋‚˜์™”๋‹ค ใ…œใ…œ

์งˆ๋ฌธํ•˜๊ธฐ์—์„œ ํ•ด๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, 

์ง์ „์— 0(์ƒํ•˜) ๋ฐฉํ–ฅ์œผ๋กœ ์˜ค๋“ , 1(์ขŒ์šฐ) ๋ฐฉํ–ฅ์œผ๋กœ ์˜ค๋“  [r][c]๊นŒ์ง€ ํ•„์š”ํ•œ cost๋Š” ๋™์ผํ•  ์ˆ˜ ์žˆ์œผ๋‚˜,

[r][c]์—์„œ ๋‹ค์Œ ์นธ์œผ๋กœ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ •๋‹ต์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

๋ฐฉํ–ฅ์ •๋ณด๊นŒ์ง€ ๊ตฌ๋ถ„ํ•ด์„œ ์ตœ์†Œ๋น„์šฉ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค!

 

๊ฒฐ๊ณผ์ ์œผ๋กœ visited[r][c][flag(๋ฐฉํ–ฅ)] ํ˜•ํƒœ๋กœ ์ด์šฉํ•˜์—ฌ ์ •๋‹ต์ด ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

์ด ๋ฌธ์ œ์˜ ํ’€์ด๋ฅผ ๋ช‡ ๊ฐœ ์ฐพ์•„๋ณด๋ฉด 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ’€์ดํ•œ ๊ฒƒ์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, 25๋ฒˆ ํ…Œ์ผ€๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ์ „์— ํ’€์ด๋œ ๊ฒƒ ๊ฐ™๋‹ค. (๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ•˜์—ฌ ์ œ์ถœํ•ด๋ณด๋‹ˆ 25๋ฒˆ์ด ์—ญ์‹œ ํ‹€๋ฆฌ๊ฒŒ ๋‚˜์™”๋‹ค)

์ฝ”๋“œ

#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;
int sCost = 100; // ์ง์„ ๋„๋กœ ๋น„์šฉ
int cCost = 600; // ์ฝ”๋„ˆ ๋น„์šฉ

struct Node {
	int r; int c; int cost; bool flag; // 0: ์ƒํ•˜, 1: ์ขŒ์šฐ
};

int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,-1,0,1 };

int BFS(vector<vector<int>> board) {
	int end = board.size() - 1;
	int N = board.size();
    //[r][c]์ง€์ ์— ์˜ค๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ ์ €์žฅ
	vector<vector<vector<int>>> visited(N, vector<vector<int>>(N, vector<int>(N, 987654321))); 
	queue<Node> q;
	visited[0][0][0] = 0;
    visited[0][0][1] = 0;
	if (board[1][0] == 0) {
		visited[1][0][0] = 100;
		q.push({ 1, 0, 100, 0 }); // ์ด์ „์— ์ƒํ•˜๋ฐฉํ–ฅ
	}
	if (board[0][1] == 0) {
		visited[0][1][1] = 100;
		q.push({ 0, 1, 100, 1 }); // ์ด์ „์— ์ขŒ์šฐ๋ฐฉํ–ฅ 
	}

	while (!q.empty()) {
		Node temp = q.front();
		q.pop();
		
		for (int i = 0;i < 4;i++) {
            int newR = temp.r + dr[i];
			int newC = temp.c + dc[i];
			int newCost = temp.cost;
			bool newFlag = temp.flag;
			if (i % 2 == (int)temp.flag) {
				newCost += sCost;
			}
			else {
				newCost += cCost;
				newFlag = !newFlag;
			}
			if (newR < 0 || newR >= N || newC< 0 || newC >= N) continue;
			if (board[newR][newC] == 1) continue;
			if (visited[newR][newC][newFlag] < newCost) continue;
			visited[newR][newC][newFlag] = newCost;
			q.push({ newR, newC, newCost, newFlag });
		}
	}
	return min(visited[end][end][0], visited[end][end][1]);
}
int solution(vector<vector<int>> board) {
	int answer = 0;
	answer = BFS(board);
	return answer;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•