KoreanFoodie's Study
[종만북 문제] 보글 게임 (문제 ID : BOGGLE, 난이도 : 하) 본문
프로그래밍 대회에서 배우는 알고리즘 문제해결 전략(이하 종만북)에서 소개된 문제를 풀이합니다. 알고리즘에 진심이시라면, 직접 구매하셔서 읽어보시는 것을 추천합니다!
핵심 :
1. 기본적으로 완전 탐색으로도, 예제로 주어진 케이스는 해결 가능하다. 하지만 제출하면 Timeout 이 발생한다.
2. Timeout 해결을 위해서는...
[종만북 문제] 보글 게임 (문제 ID : BOGGLE, 난이도 : 하)
기본적으로 완전 탐색으로 코드를 짜 보자. 무식하게 탐색한다면, 인접한 각 탐색 마다 인접한 8 개의 문자를 확인해야 하므로, 시간 복잡도는 O(8^N) 이 될 것이다.
#include <iostream>
#include "stdlib.h"
#include <vector>
#include <queue>
using namespace std;
char board[5][5];
int N;
vector<string> words;
int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
struct target
{
int row;
int col;
int idx;
};
struct cmp
{
bool operator()(const target l, const target r) const
{
return l.idx < r.idx;
}
};
bool findWord(const string& word)
{
priority_queue<target, vector<target>, cmp> q;
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j)
if (board[i][j] == word[0])
q.push({ i, j, 0 });
while (!q.empty())
{
target cur = q.top();
q.pop();
if (cur.idx == word.size() - 1)
return true;
for (int d = 0; d < 8; ++d)
{
int nRow = cur.row + dir[d][0];
int nCol = cur.col + dir[d][1];
if (nRow < 0 || nRow >= 5 || nCol < 0 || nCol >= 5)
continue;
if (board[nRow][nCol] == word[cur.idx + 1])
{
q.push({ nRow, nCol, cur.idx + 1 });
}
}
}
return false;
}
void sol()
{
for (const string& word : words)
{
bool found = findWord(word);
cout << word << " ";
if (found) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
void inputHandler()
{
for (int i = 0; i < 5; ++i)
{
string row;
cin >> row;
for (int j = 0; j < 5; ++j)
board[i][j] = row[j];
}
cin >> N;
words.resize(N);
for (int i = 0; i < N; ++i)
cin >> words[i];
}
int main()
{
int cases;
cin >> cases;
while (cases--)
{
// fill board & words
inputHandler();
sol();
}
return 0;
}
불행히도.. 위처럼 완전 탐색을 이용하면 Timeout 이 난다.
책에서 나온 코드는 다음과 같은데, 이 역시도 Timeout 이 날 것이다. 😅
그렇다면 Timeout 을 해결한 코드는...? 8 장에서 DP 를 이용하게 되는데, 그 때 공개하도록 하겠다. 😉
'Data Structures, Algorithm > 종만북' 카테고리의 다른 글
[종만북 문제] 게임판 덮기 (문제 ID : BOARDCOVER, 난이도 : 하) (0) | 2024.03.04 |
---|---|
[종만북 문제] 소풍 (문제 ID : PICNIC, 난이도 : 하) (0) | 2024.03.03 |
[종만북 요약] 4~5. 알고리즘 분석 (P-NP, 알고리즘 정당성 증명) (1) | 2024.03.02 |
[종만북 문제] 록 페스티벌 (난이도: 하, 문제 ID : FESTIVAL) (0) | 2024.02.29 |
[종만북 요약] 1~3. 문제 해결 시작하기 (PS 문제 해결 단계와 좋은 코드를 위한 조언) (1) | 2024.02.29 |
Comments