Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1175. ๋ฐฐ๋‹ฌ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1175. ๋ฐฐ๋‹ฌ

bba_dda 2021. 2. 26. 01:40
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์ถœ์ฒ˜

www.acmicpc.net/problem/1175

 

1175๋ฒˆ: ๋ฐฐ๋‹ฌ

์–ด์ œ ์„ ๋ฌผ์„ ๋ชจ๋‘ ํฌ์žฅํ•œ ๋ฏผ์‹์ด๋Š” ์ด์ œ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฏผ์‹์ด๊ฐ€ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•  ๊ณณ์€ ์ด ๋ฌธ์ œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์•‰์•„ ์žˆ๋Š” ๊ต์‹ค์ด๋‹ค. ๊ต์‹ค์€ ์ง์‚ฌ๊ฐํ˜•๋ชจ์–‘์ด๊ณ , ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ •์‚ฌ

www.acmicpc.net

๋ฌธ์ œ

์–ด์ œ ์„ ๋ฌผ์„ ๋ชจ๋‘ ํฌ์žฅํ•œ ๋ฏผ์‹์ด๋Š” ์ด์ œ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฏผ์‹์ด๊ฐ€ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•  ๊ณณ์€ ์ด ๋ฌธ์ œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์•‰์•„ ์žˆ๋Š” ๊ต์‹ค์ด๋‹ค. ๊ต์‹ค์€ ์ง์‚ฌ๊ฐํ˜•๋ชจ์–‘์ด๊ณ , ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

์ž…๋ ฅ์œผ๋กœ ๊ต์‹ค์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๋ธ”๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • S : ์ง€๊ธˆ ๋ฏผ์‹์ด๊ฐ€ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์ด๊ณณ์ด ๋ฏผ์‹์ด๊ฐ€ ๋ฐฐ๋‹ฌ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ณณ์ด๋‹ค.
  • C : ๋ฏผ์‹์ด๊ฐ€ ๋ฐ˜๋“œ์‹œ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ณณ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ธ”๋ก์€ ์ •ํ™•ํ•˜๊ฒŒ 2๊ฐœ ์žˆ๋‹ค.
  • # : ๋ฏผ์‹์ด๊ฐ€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ณณ์ด๋‹ค.
  • . : ๋ฏผ์‹์ด๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋‹ค.

๋ฏผ์‹์ด๊ฐ€ ํ•œ ๋ธ”๋ก ๋™์„œ๋‚จ๋ถ์œผ๋กœ ์ด๋™ํ•˜๋Š”๋ฐ๋Š” 1๋ถ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋ฏผ์‹์ด๋Š” ๋„ค๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ต์‹ค์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค. ๋ฏผ์‹์ด๊ฐ€ ์„ ๋ฌผ์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ณณ์— ๋“ค์–ด๊ฐˆ ๋•Œ, ๋ฏผ์‹์ด๋Š” ๊ทธ ๊ณณ์— ์žˆ๋Š” ์‚ฌ๋žŒ ๋ชจ๋‘์—๊ฒŒ ์„ ๋ฌผ์„ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ƒํ™ฉ์€ ๋™์‹œ์— ์ผ์–ด๋‚˜๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ฏผ์‹์ด๋Š” ์–ด๋Š ๋ˆ„๊ตฌ๋„ ์ž์‹ ์„ ๋ณด์ง€ ์•Š์•˜์œผ๋ฉด ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋งค ์‹œ๊ฐ„๋งˆ๋‹ค ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค. ์ด ๋ง์€ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‘ ๋ฒˆ ์—ฐ์†์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ด๋‹ค. ๋ฏผ์‹์ด๊ฐ€ ์„ ๋ฌผ์„ ๋ชจ๋‘ ๋ฐฐ๋‹ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ต์‹ค์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ต์‹ค์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฏผ์‹์ด๊ฐ€ ์„ ๋ฌผ์„ ๋ชจ๋‘ ๋ฐฐ๋‹ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋ถˆ๊ฐ€๋Šฅ ํ•  ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 


ํ’€์ด

์ด ๋ฌธ์ œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ตœ๋‹จ๊ฒฝ๋กœ์ฐพ๊ธฐ ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

  • ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ์†์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์„ ๋ฌผ์„ ๋‘ ๊ตฐ๋ฐ์— ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•œ๋‹ค (๋‘ ๊ฐœ์˜ ๋„์ฐฉ์ง€๋ฅผ ๋ชจ๋‘ ์ฐ์–ด์•ผ ์™„๋ฃŒ)

๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ณ€ํ˜•์ด ํ•„์š”ํ–ˆ๋‹ค. 

 

์ค‘๋ณต ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด, queue๊ฐ€ ๋นˆ ๊ฒƒ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค. 

(queue๊ฐ€ ํ‰์ƒ ๋น„์–ด์žˆ์„ ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ) 

๋”ฐ๋ผ์„œ "์–ด๋–ป๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค์ธ์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š”๊ฐ€"๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฑธ๋ฆผ๋Œ์ด ๋˜์—ˆ๋‹ค. 

 

ํ•ด๋‹น ์นธ์— ์ค‘๋ณต ์ ‘๊ทผ ํšŸ์ˆ˜๋ฅผ ๋ฌด์ œํ•œ์ด ์•„๋‹ˆ๋ผ 1000, 10000 ๋“ฑ์œผ๋กœ ์ฃผ์–ด๋ณด์•˜๋Š”๋ฐ,

์ˆซ์ž๊ฐ€ ์ž‘์œผ๋ฉด "ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค" 

์ˆซ์ž๊ฐ€ ์ปค์ง€๋ฉด "๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ"์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. 

 

๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ๋งํฌ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ’€์—ˆ๋‹ค. 

sweetday-alice.tistory.com/177

 

[C++][๋ฐฑ์ค€ 2178] ๋ฏธ๋กœํƒ์ƒ‰ - BFS๋ฅผ ์ด์šฉํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ

[๋ฐฑ์ค€ 2178] ๋ฏธ๋กœํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์•ผํ•˜๋Š”์ง€ ํžŒํŠธ๋ฅผ ์–ป์–ด๋ณด์ž. ๋‚ด๊ฐ€ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€, (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ๋•Œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์ตœ์†Œ์˜ ์นธ ์ˆ˜ => BFS!! ์ฐธ๊ณ ) BFS : ๋„ˆ๋น„ ์šฐ์„ 

sweetday-alice.tistory.com

visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋˜, ๊ธฐ์กด์— visited[r][c] ์—์„œ visited[r][c][๋ฐฉํ–ฅ][1๋ฒˆ๋„์ฐฉ์ง€์  ๋ฐฉ๋ฌธ ์—ฌ๋ถ€][2๋ฒˆ๋„์ฐฉ์ง€์  ๋ฐฉ๋ฌธ ์—ฌ๋ถ€] ๋กœ ์ผ€์ด์Šค๋ฅผ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. 

 

์ด๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ง€๋„์—์„œ C๋กœ ํ‘œ์‹œ๋œ ๋‘ ๊ฐœ์˜ ๋„์ฐฉ์ ์„ ๋‹ค๋ฅด๊ฒŒ ์‹๋ณ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๋„์—์„œ ํ•˜๋‚˜์˜ C๋ฅผ D๋กœ ๋ฐ”๊พธ์–ด์ค€ ๋’ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. 

 

์ฝ”๋“œ 

#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <memory.h>

using namespace std;

#define U 1
#define D 2
#define L 3
#define R 4

struct node {
	int x;
	int y;
	int count;
	int dir;
	int visited_C;
	int visited_D;
};

int dfs(vector<vector<char>> table, int n, int m, int startN, int startM) {
	bool visited[50][50][5][2][2];
	memset(visited, false, sizeof(visited));
	int count = -1;
	queue<node> q;
	node start = { startM, startN, 0, 0, 0, 0};
	q.push(start);
	while (!q.empty()) {
		node temp = q.front();
		q.pop();

		// ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด pass 
		if (visited[temp.y][temp.x][temp.dir][temp.visited_C][temp.visited_D])
			continue;

		// ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋ฐฐ๋‹ฌ์ง€์ธ์ง€ ํ™•์ธ 
		if (table[temp.y][temp.x] == 'C') 
			temp.visited_C = 1;
		if (table[temp.y][temp.x] == 'D') 
			temp.visited_D = 1;

		// ์„ ๋ฌผ์„ ๋ชจ๋‘ ๋ฐฐ๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธ
		if (temp.visited_C == 1 && temp.visited_D == 1)
			return temp.count;

		//ํ˜„์žฌ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ
		visited[temp.y][temp.x][temp.dir][temp.visited_C][temp.visited_D] = true; 
		
		//ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ ์ฐพ๊ธฐ 
		if (temp.dir != 1 && temp.y > 0)  // UP
			if (table[temp.y - 1][temp.x] != '#')
				q.push({ temp.x, temp.y - 1, temp.count + 1, U, temp.visited_C, temp.visited_D });
		if (temp.dir != 2 && temp.y < n - 1)  // DOWN
			if (table[temp.y + 1][temp.x] != '#')
				q.push({ temp.x, temp.y + 1,temp.count + 1, D, temp.visited_C, temp.visited_D });
		if (temp.dir != 3 && temp.x > 0)  // LEFT
			if (table[temp.y][temp.x - 1] != '#') 
				q.push({ temp.x - 1,  temp.y,temp.count + 1, L, temp.visited_C, temp.visited_D });
		if (temp.dir != 4 && temp.x < m-1)  // RIGHT
			if (table[temp.y][temp.x + 1] != '#') 
				q.push({ temp.x + 1,  temp.y,temp.count + 1, R, temp.visited_C, temp.visited_D });
	}
	return count;
}
int main(void) {
	int n, m;
	vector<vector<char>> classroom;
	int startN, startM;
	cin >> n >> m;
	int idxC = 0;
	for (int i = 0;i < n;i++) {
		string s;
		cin >> s;
		vector<char> temp(s.begin(), s.end());
		
		vector<char>::iterator iter1 = find(temp.begin(), temp.end(), 'S');
		if (iter1 != temp.end()) {
			startN = i;
			startM = distance(temp.begin(), iter1);
		}
		vector<char>::iterator iter2 = find(temp.begin(), temp.end(), 'C');
		while (iter2 != temp.end()) {
			idxC++;
			if (idxC == 2)
				temp[distance(temp.begin(), iter2)] = 'D';
			iter2 = find(iter2+1, temp.end(), 'C');
		}
		classroom.push_back(temp);
	}
	cout << dfs(classroom, n, m, startN, startM) << endl;
 	return 0;
}
๋ฐ˜์‘ํ˜•