๐ ๋งํฌ
https://www.acmicpc.net/problem/9202
https://github.com/jokj624/PS/blob/master/5000-10000/9202.cpp
๐คฏ ํ์ค ํ๊ธฐ
ํ์ค ํ๊ธฐ : ์ ์ญ๋๊ธ ํ๋ค์๋ ๋ฌธ์
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
์คํฐ๋์์ ํผ ๋ฌธ์ ์ด๋ค.
ํธ๋ฆฌ ๋ฌธ์ ์ธ๊ฑธ ๋ณด๊ณ ๋ค์ด๊ฐํฐ์ฌ์ ๋ฐ๋ก ์๊ฐ ๋ฌ๋๊ฑด ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ์๋ค.
๊ทธ๋ฐ๋ฐ ํ์ด๋ณธ ์ ์ ์๊ณ , ๋จ์ด๋ฅผ ์ ์ฅํ๋ ํธ๋ฆฌ, ๋น ๋ฅด๊ฒ ๊ฒ์ํ๋ ํธ๋ฆฌ ์ ๋๋ก๋ง ์๊ณ ์์์.
๊ฐ์ด ํ๋ ์น๊ตฌ๋คํํ ๋จ์ด๋ค์ ํธ๋ผ์ด ํธ๋ฆฌ์ ์ ์ฅํด ๋๊ณ , ๋ฐ์ ๋ณด๋ํ์ dfs๋ก ํ์ ํ๋ฉด์ ์ฐพ๋ ๊ฒ ์ด๋ป๋๊ณ ํ๋ค.
๊ฑฐ์ ๋ง๋ ๊ฑฐ ๊ฐ๊ธด ํ๋๋ฐ ํธ๋ผ์ด ๋ฌธ์ ๋ฅผ ํ์ด๋ณธ ์ ์ด ์์ด์ ์ด๋ป๊ฒ ํ ์ง ๋ง๋งํ๋ค.
์ผ๋จ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ฑ์ผ๋ก ๊ตฌ๊ธ๋งํด์ ์ตํ๊ณ , c++ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์งฐ๋ค.
https://it-and-life.tistory.com/166
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ
ํธ๋ผ์ด ํธ๋ฆฌ์ ๊ฒ์ ์๊ฐ๋ณต์ก๋๋ ์ ์ฅ๋ ๋จ์ด ๊ธธ์ด ์ค ์ต๋๋ฅผ M์ด๋ผ ํ ๋, O(M) ์ด๋ผ๊ณ ํ๋ค.
์ผ์ถ ๊ตฌ์ฑ์ ํ๊ณ , ๋ณด๋ํ ํ์์ ์งํํ๋๋ฐ ์ฒ์์ ๋ชจ๋ ์นธ์์ ํ๋ฒ์ฉ dfs๋ฅผ ๋๋ฆฌ๋ฉด TLE๊ฐ ๋ฐ์ํ ๊น๋ด ๋ณด๋ํ ํ๊ฐ๋น ํ๋ฒ๋ง ๋๊ฒ๋ ๊ตฌ์ฑ์ ํ๋๋ ๋ง๋ค ์ ์์๋ค.
๊ทธ๋์ ๊ทธ๋ฅ 4X4 16์นธ์์ ๋ชจ๋ ํ๋ฒ์ฉ dfs๋ฅผ ๋๋ฆฌ๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌํํ๋ค.
์๊ฐ์ด 10์ด๋ผ ์์ ํ์ํด๋ ๊ด์ฐฎ๋ค.
dfs๋ฅผ ํธ์ถํ ๋, word์ ํ ๋ฌธ์์ฉ ๋ํด๊ฐ๋ฉฐ ๋จ์ด ๊ธธ์ด๊ฐ 8์ ๋์ง ์์ ๋ ๊น์ง๋ง ํธ๋ผ์ด ํธ๋ฆฌ์์ search ํด์คฌ๋ค.
๋จ์ด๊ฐ ์ค๋ณต๋๋ฉด ํ๋๋ง ์ผ ๊ฑธ๋ก ์ณ์ผํ๋๋ฐ ์ด๋ set์ ์ ์ฅํด ํด๊ฒฐํ๋ค.
์ค๋ณต๋ ๋จ์ด๊ฐ ์์ ๋๋ง set์ insertํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๋ญ๋ฐ์..?
์์ ๋ง๊ณ , ์ ๊ทผ๋ฒ ์๋ฒฝํด๋ณด์๋๋ฐ
๊ฒฐ๊ตญ ์๋ฒฝ๊น์ง ์ด๋ฆฌ์ ๋ฆฌ ์ฝ๋๋ฅผ ๊ณ ์น๋ค๊ฐ ์๊ณ ์ค๋ ๋ค์ ํ์ด์ ํ๊ฒน๊ฒ AC๋ฅผ ๋ฐ์๋ค.
๊ตฌ๊ธ๋งํ๋ค๊ฐ ํ ๋ธ๋ก๊ทธ์์ ๋ฐ๋ก๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ
https://dlwnsdud205.tistory.com/120
์ด ๋ถ ๋ธ๋ก๊ทธ์์ ๋ฐ๊ฒฌํ๋ค.
ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๋ชป ๋ง๋ ๊ฑฐ์๋ค.
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++ (0) | 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 |