[BOJ/9202] Boggle, c++

2021. 6. 4. 19:45ยทDEV/PS

๐Ÿ”— ๋งํฌ

https://www.acmicpc.net/problem/9202

 

9202๋ฒˆ: Boggle

๊ฐ๊ฐ์˜ Boggle์— ๋Œ€ํ•ด, ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜, ๊ฐ€์žฅ ๊ธด ๋‹จ์–ด, ์ฐพ์€ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ํ•œ Boggle์—์„œ ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฐพ์€ ๊ฒฝ์šฐ์—๋Š” ํ•œ ๋ฒˆ๋งŒ ์ฐพ์€ ๊ฒƒ์œผ๋กœ ์„ผ๋‹ค. ๊ฐ€์žฅ ๊ธด ๋‹จ์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ

www.acmicpc.net

https://github.com/jokj624/PS/blob/master/5000-10000/9202.cpp

 

jokj624/PS

BOJ, CodeForces ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์†Œ์Šค์ฝ”๋“œ. Contribute to jokj624/PS development by creating an account on GitHub.

github.com

๐Ÿคฏ ํ•œ์ค„ ํ›„๊ธฐ

ํ•œ์ค„ ํ›„๊ธฐ : ์™€ ์—ญ๋Œ€๊ธ‰ ํž˜๋“ค์—ˆ๋˜ ๋ฌธ์ œ 

์•Œ๊ณ  ์ ‘๊ธฐ ์‹คํŒจ

๐Ÿคท ๋ฌธ์ œ

๐Ÿ‘ฉ‍๐Ÿ’ป ํ’€์ด

์Šคํ„ฐ๋””์—์„œ ํ‘ผ ๋ฌธ์ œ์ด๋‹ค.

ํŠธ๋ฆฌ ๋ฌธ์ œ์ธ๊ฑธ ๋ณด๊ณ  ๋“ค์–ด๊ฐ„ํ„ฐ์—ฌ์„œ ๋ฐ”๋กœ ์ƒ๊ฐ ๋‚ฌ๋˜๊ฑด ํŠธ๋ผ์ด ์ž๋ฃŒ๊ตฌ์กฐ์˜€๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ’€์–ด๋ณธ ์ ์€ ์—†๊ณ , ๋‹จ์–ด๋ฅผ ์ €์žฅํ•˜๋Š” ํŠธ๋ฆฌ, ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ํŠธ๋ฆฌ ์ •๋„๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ์Œ.

๊ฐ™์ด ํ•˜๋Š” ์นœ๊ตฌ๋“คํ•œํ…Œ ๋‹จ์–ด๋“ค์„ ํŠธ๋ผ์ด ํŠธ๋ฆฌ์— ์ €์žฅํ•ด ๋†“๊ณ , ๋ฐ‘์— ๋ณด๋“œํŒ์€ dfs๋กœ ํƒ์ƒ‰ ํ•˜๋ฉด์„œ ์ฐพ๋Š” ๊ฒŒ ์–ด๋–ป๋ƒ๊ณ  ํ–ˆ๋‹ค.

๊ฑฐ์˜ ๋งž๋Š” ๊ฑฐ ๊ฐ™๊ธด ํ–ˆ๋Š”๋ฐ ํŠธ๋ผ์ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณธ ์ ์ด ์—†์–ด์„œ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋ง‰๋ง‰ํ–ˆ๋‹ค.

 

์ผ๋‹จ ํŠธ๋ผ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์†์„ฑ์œผ๋กœ ๊ตฌ๊ธ€๋งํ•ด์„œ ์ตํžˆ๊ณ , c++ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์งฐ๋‹ค. 

https://it-and-life.tistory.com/166

 

[์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ฆฌ(Tree) - ํŠธ๋ผ์ด ํŠธ๋ฆฌ(Trie tree)

์•„๋ž˜์˜ ์˜์ƒ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€์˜์ƒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Trie(ํŠธ๋ผ์ด) Tree์— ๋Œ€ํ•ด์„œ - https://youtu.be/TohdsR58i3Q Trie - Insert and Search | GeeksforGeeks - https://youtu.be/dUBkaqrc..

it-and-life.tistory.com

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ

ํŠธ๋ผ์ด ํŠธ๋ฆฌ์˜ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ €์žฅ๋œ ๋‹จ์–ด ๊ธธ์ด ์ค‘ ์ตœ๋Œ€๋ฅผ M์ด๋ผ ํ• ๋•Œ, O(M) ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

์–ผ์ถ” ๊ตฌ์„ฑ์„ ํ–ˆ๊ณ , ๋ณด๋“œํŒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์ฒ˜์Œ์— ๋ชจ๋“  ์นธ์—์„œ ํ•œ๋ฒˆ์”ฉ dfs๋ฅผ ๋Œ๋ฆฌ๋ฉด TLE๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ๋ด ๋ณด๋“œํŒ ํ•œ๊ฐœ๋‹น ํ•œ๋ฒˆ๋งŒ ๋Œ๊ฒŒ๋” ๊ตฌ์„ฑ์„ ํ–ˆ๋”๋‹ˆ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ๋‹ค. 

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ 4X4 16์นธ์—์„œ ๋ชจ๋‘ ํ•œ๋ฒˆ์”ฉ dfs๋ฅผ ๋Œ๋ฆฌ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์‹œ๊ฐ„์ด 10์ดˆ๋ผ ์™„์ „ ํƒ์ƒ‰ํ•ด๋„ ๊ดœ์ฐฎ๋‹ค.

 

dfs๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, word์— ํ•œ ๋ฌธ์ž์”ฉ ๋”ํ•ด๊ฐ€๋ฉฐ ๋‹จ์–ด ๊ธธ์ด๊ฐ€ 8์„ ๋„˜์ง€ ์•Š์„ ๋•Œ ๊นŒ์ง€๋งŒ ํŠธ๋ผ์ด ํŠธ๋ฆฌ์—์„œ search ํ•ด์คฌ๋‹ค.

๋‹จ์–ด๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ํ•˜๋‚˜๋งŒ ์„ผ ๊ฑธ๋กœ ์ณ์•ผํ•˜๋Š”๋ฐ ์ด๋Š” set์— ์ €์žฅํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ค‘๋ณต๋œ ๋‹จ์–ด๊ฐ€ ์—†์„ ๋•Œ๋งŒ set์— insertํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

???

๋ญ”๋ฐ์š”..?

์˜ˆ์ œ ๋งž๊ณ , ์ ‘๊ทผ๋ฒ• ์™„๋ฒฝํ•ด๋ณด์˜€๋Š”๋ฐ 

๊ฒฐ๊ตญ ์ƒˆ๋ฒฝ๊นŒ์ง€ ์ด๋ฆฌ์ €๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๋‹ค๊ฐ€ ์ž๊ณ  ์˜ค๋Š˜ ๋‹ค์‹œ ํ’€์–ด์„œ ํž˜๊ฒน๊ฒŒ AC๋ฅผ ๋ฐ›์•˜๋‹ค.

 

๊ตฌ๊ธ€๋งํ•˜๋‹ค๊ฐ€ ํ•œ ๋ธ”๋กœ๊ทธ์—์„œ ๋ฐ˜๋ก€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ

https://dlwnsdud205.tistory.com/120 

 

[๋ฐฑ์ค€ / BOJ] 9202 Boggle

๋ฌธ์ œ ์ถœ์ฒ˜ : www.acmicpc.net/problem/9202 9202๋ฒˆ: Boggle ๊ฐ๊ฐ์˜ Boggle์— ๋Œ€ํ•ด, ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜, ๊ฐ€์žฅ ๊ธด ๋‹จ์–ด, ์ฐพ์€ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ํ•œ Boggle์—์„œ ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฐพ์€ ๊ฒฝ์šฐ์—๋Š” ํ•œ..

dlwnsdud205.tistory.com

์ด ๋ถ„ ๋ธ”๋กœ๊ทธ์—์„œ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

ํŠธ๋ผ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ž˜๋ชป ๋งŒ๋“  ๊ฑฐ์˜€๋‹ค.

 

3

ABC
AB
A

 

1

ABCX
XXXX
XXXX
XXXX

 

๋‹ต์ด 1 ABC 3 ์ธ๋ฐ ๋‚œ 1 ABC 1์ด ๋–ด๋‹ค.

 

์ฒ˜์Œ ์ œ์ถœํ•œ ์ฝ”๋“œ์—์„œ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ํ˜น์‹œ๋‚˜ ์ €๋ž‘ ๋˜‘๊ฐ™์€๋ฐ ํ˜ผ์ž ๊ณ ์ณ๋ณด๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค์€ ๋”๋ณด๊ธฐ ๋ˆ„๋ฅด์ง€ ๋งˆ์‹œ๊ณ ,,

๋”๋ณด๊ธฐ
bool findWord(string str, int idx, Node* node){
		if(!node->child.empty() && idx >= str.length())	return false;
		if(idx >= str.length())	return true;
		int next = -1;
		for(int i=0; i<node->child.size(); i++){
			if(str[idx] == node->child[i]->data){
				next = i;
				break;
			}
		}
		if(next != -1)	return findWord(str,idx+1,node->child[next]); // ๋™์ผ ๋ฌธ์ž ์กด์žฌ 
		else	return false; //๊ฒ€์ƒ‰ ์‹คํŒจ
}
void insert(string str, int idx, Node* node){
		if(idx >= str.length())	return;
		int next = -1;
		for(int i=0; i<node->child.size(); i++){
			if(str[idx] == node->child[i]->data){
				next = i;
				break;
			}
		}
		if(next != -1){
			insert(str, idx+1, node->child[next]);
		}
		else{
			Node* newNode = new Node;
			newNode->data = str[idx];
			node->child.push_back(newNode);
			insert(str, idx+1, newNode);
		}
}

๋‚˜๋Š” ๋‹จ์–ด ์ „์ฒด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์žˆ์–ด์„œ ๋งŒ์•ฝ ABC๊ฐ€ ๋จผ์ € ๋“ค์–ด์˜ค๋ฉด AB, A๋Š” search์—์„œ ์ฒซ๋ฒˆ์งธ ํ–‰์— ์˜ํ•ด ๋ฐ”๋กœ false๋ฅผ ๋ฆฌํ„ดํ•œ ๊ฒƒ์ด์˜€๋‹ค.

๋”ฐ๋ผ์„œ Node class์— ๋‹จ์–ด ์ „์ฒด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , insertํ•  ๋•Œ, ํ•ด๋‹น ์œ„์น˜ ๋…ธ๋“œ์— strData ๋ณ€์ˆ˜์— ๋‹จ์–ด ์ „์ฒด๋ฅผ ๋„ฃ์–ด์ค˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

//AC
//BOJ 9202 Boggle
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
int dx[8] = {0, 0, 1, -1, -1, -1, 1, 1};
int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
set<string> ans;
string map[4], wordMax;
bool visit[4][4];
int wordSizeMax = 0;
int maxScore = 0;
class Node {
	public:
		char data;    //๋ฌธ์ž ์ €์žฅ ๋ณ€์ˆ˜
		string strData;   // ๋‹จ์–ด ์ €์žฅํ•  ๋ณ€์ˆ˜
		vector<Node*> child;
};
class Trie{
	private:
		Node* root = new Node;
	public:
		void push(string str){
			insert(str, 0, root);
		}
		void insert(string str, int idx, Node* node){
			if(idx >= str.length()){
				node->strData = str;   // ๋‹จ์–ด ์ €์žฅ
				return;
			}
			int next = -1;
			for(int i=0; i<node->child.size(); i++){
				if(str[idx] == node->child[i]->data){
					next = i;
					break;
				}
			}
			if(next != -1){
				insert(str, idx+1, node->child[next]);
			}
			else{
				Node* newNode = new Node;    //ํ•ด๋‹น ๋ฌธ์ž ์—†๋‹ค๋ฉด ๋…ธ๋“œ ์ƒˆ๋กœ ์ƒ์„ฑ
				newNode->data = str[idx];
				node->child.push_back(newNode);
				insert(str, idx+1, newNode);
			}
		}
		bool search(string str){
			return findWord(str, 0, root);
		}
		bool findWord(string str, int idx, Node* node){
			if(!node->child.empty() && idx >= str.length())	{
				if(node->strData == str)	return true;    //๋ฆฌํ”„๋…ธ๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ํ•ด๋‹น ๋‹จ์–ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ณณ
				else	return false;	
			}
			if(idx >= str.length())	return true;  // ๋ฆฌํ”„๋…ธ๋“œ
			int next = -1;
			for(int i=0; i<node->child.size(); i++){
				if(str[idx] == node->child[i]->data){
					next = i;
					break;
				}
			}
			if(next != -1)	return findWord(str,idx+1,node->child[next]); // ๋™์ผ ๋ฌธ์ž ์กด์žฌ 
			else	return false; //๊ฒ€์ƒ‰ ์‹คํŒจ
		}
};
Trie* trie = new Trie;
int score(int size){
	switch (size){
		case 1: 
		case 2:
			return 0;
			break;
		case 3:
		case 4: 
			return 1;
			break;
		case 5:
			return 2;
			break;
		case 6:
			return 3;
			break;
		case 7:
			return 5;
			break;
		case 8:
			return 11;
			break;
	}
	return 0;
}
void dfs(int x, int y, string word){
	if(visit[x][y])	return;  //์ด๋ฏธ ๋ฐฉ๋ฌธ
	if(word.size() > 8){  //8์ž๋ฆฌ ๋‹จ์–ด๊ฐ€ ์ตœ๋Œ€
		return;
	}
	if(trie->search(word)){   // ๋‹จ์–ด ์กด์žฌ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
		if(ans.find(word) == ans.end()){  // ๋‹จ์–ด ์ค‘๋ณต ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
			ans.insert(word);  // set์— ์‚ฝ์ž…
			maxScore += score(word.length());   //์ ์ˆ˜ ํ•ฉ๊ณ„
			if(word.length() > wordSizeMax){   // ๋” ๊ธด ๋‹จ์–ด ์ฐพ๊ธฐ
				wordSizeMax = word.length();
				wordMax = word;   
			}
			else if(word.length() == wordSizeMax){
				wordMax = min(wordMax, word);   //์‚ฌ์ „ ์ˆœ 
			}
		}
	}
	visit[x][y] = true;
	for(int i=0; i<8; i++){
		int nx = x+dx[i];
		int ny = y+dy[i];
		if(nx < 0 || ny < 0 || nx >= 4|| ny >= 4)	continue;
		word += map[nx][ny];  
		dfs(nx, ny, word);
		word.pop_back();
	}
	visit[x][y] = false; 
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int w, b;
	cin >> w;
	for(int i=0; i<w; i++){
		string s;
		cin >> s;
		trie->push(s);
	}

	cin >> b;
	for(int i=0; i<b; i++){
		for(int j=0; j<4; j++){
			cin >> map[j];
		}
		for(int m=0; m<4; m++){
			for(int n=0; n<4; n++){
				visit[m][n]  = false;
			}
		}
		ans.clear();
		wordSizeMax = 0; 	maxScore = 0;	wordMax.clear();
		for(int k=0; k<4; k++){ 
			for(int l=0; l<4; l++){
				string s;
				s.push_back(map[k][l]);
				dfs(k, l, s);
			}
		}
		cout << maxScore << " " << wordMax << " " << ans.size()<< "\n";
	}

	return 0;
}
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'DEV > PS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ/2023] ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜, c++  (1) 2021.06.08
[BOJ/21921] ๋ธ”๋กœ๊ทธ , c++  (0) 2021.06.08
[BOJ/21872] Deque Game, c++  (0) 2021.06.04
[BOJ/1103] ๊ฒŒ์ž„, c++  (0) 2021.05.29
[BOJ/13334] ์ฒ ๋กœ, c++  (0) 2021.05.20
'DEV/PS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [BOJ/2023] ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜, c++
  • [BOJ/21921] ๋ธ”๋กœ๊ทธ , c++
  • [BOJ/21872] Deque Game, c++
  • [BOJ/1103] ๊ฒŒ์ž„, c++
jobchae
jobchae
๋งํ•˜๋Š” ๊ฐ์ž์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๋„์ ์ด๋Š” Node.js ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.
  • jobchae
    JOBCHAE
    jobchae
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿš€ JOBCHAE (177)
      • DEV (146)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • ์žก๋‹คํ•œ ๊ฐœ๋ฐœ ์ผ์ง€ (20)
        • injection (1)
        • CI CD (0)
        • JS, TS (1)
      • ์ถ•๊ตฌ (0)
      • ์ผ์ƒ (19)
      • ์˜ํ™” (3)
      • ์Œ์•… (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๐Ÿ’ป Github
    • ๐Ÿ™‹๐Ÿป Linkedin
    • ๐Ÿ“– ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • PS Github
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    mongoDB
    nodejs
    node.js
    ์Šฌ๋ž™๋ด‡
    react
    ํšŒ๊ณ 
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์œ„์ƒ์ •๋ ฌ
    PS
    DFS
    ๋ฆฌ์•กํŠธ
    ์ผ์ƒ
    Nest.js
    ๋ ›์ธ ๋ฝํŽ˜์Šคํ‹ฐ๋ฒŒ
    BFS
    ๋ฐฑ์ค€
    Express
    ์Šฌ๋ž™
    aws
    slack
    SOPT
    DP
    ์ด๋ถ„ํƒ์ƒ‰
    ์•ฑ์žผ
    ์†ํŠธ
    typescript
    ์šฐ์„ ์ˆœ์œ„ํ
    boj
    GitHub
    Nest
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
jobchae
[BOJ/9202] Boggle, c++
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”