BOJ 1987. ์ํ๋ฒณ
๐โโ๏ธ[Gold IV] ์ํ๋ฒณ - 1987
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2028 KB, ์๊ฐ: 1624 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน, ๊น์ด ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
์ ์ถ ์ผ์
2024๋ 1์ 17์ผ 10:31:40
๋ฌธ์ ์ค๋ช
์ธ๋ก
๋ง์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋ค ์นธ ์ค์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋๋ฐ, ์๋ก ์ด๋ํ ์นธ์ ์ ํ ์๋ ์ํ๋ฒณ์ ์ง๊ธ๊น์ง ์ง๋์จ ๋ชจ๋ ์นธ์ ์ ํ ์๋ ์ํ๋ฒณ๊ณผ๋ ๋ฌ๋ผ์ผ ํ๋ค. ์ฆ, ๊ฐ์ ์ํ๋ฒณ์ด ์ ํ ์นธ์ ๋ ๋ฒ ์ง๋ ์ ์๋ค.
์ข์ธก ์๋จ์์ ์์ํด์, ๋ง์ด ์ต๋ํ ๋ช ์นธ์ ์ง๋ ์ ์๋์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ง์ด ์ง๋๋ ์นธ์ ์ข์ธก ์๋จ์ ์นธ๋ ํฌํจ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ง์ด ์ง๋ ์ ์๋ ์ต๋์ ์นธ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
DFS๋ฌธ์ ๋ก ๋ฐฑํธ๋ํน์ ํด์ผํ๋ค.
์ฒ์์ BFS๋ก ์ ๊ทผํ๋ค๊ฐ ์ํ๋ ค์ ๋ค์ ํ๋ค.
char๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์๋ก ์ถ๊ฐํ ์ํ๋ฒณ์ด ๊ธฐ์กด์ ๋ฑ๋ก๋์ด ์๋์ง ํ์ธํ๋ฉด์ DFS๋ฅผ ๋๋ ค์ผํ๋ค.
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
int seqSize = 1;
void DFS(pair<int, int> here)
{
ch[seqSize++] = board[here.first][here.second];
res = max(res, seqSize);
// ๊ธฐ๋ก๋ ch ํ์ธ์ฉ
//cout << endl;
//cout << "ํ์ฌ ch ์ํ " << endl;
//for (int i = 1; i <= seqSize; ++i)
//{
// cout << ch[i] << " ";
//}
//cout << endl;
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > r || nx > c)
continue;
if (visited[ny][nx] == 1)
continue;
bool flag = false;
for (int j = 1; j <= seqSize; ++j)
{
if (ch[j] == board[ny][nx])
{
flag = true;
break;
}
}
if (flag == true)
continue;
visited[ny][nx] = 1;
DFS({ ny, nx });
visited[ny][nx] = 0;
ch[--seqSize] = ' ';
}
}
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ ๋ ฅ์ด ๋ค์ด์ค๋ฉด
2 4
CAAB
ADCB
์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ธ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int r, c, res = 0;
char ch[500];
vector<vector<char>> board;
vector<vector<int>> visited;
void setting()
{
cin >> r >> c;
board = vector<vector<char>>(r + 1, vector<char>(c + 1));
visited = vector<vector<int>>(r + 1, vector<int>(c + 1));
string str;
for (int i = 1; i <= r; ++i)
{
cin >> str;
for (int j = 0; j < str.size(); ++j)
{
board[i][j + 1] = str[j];
}
}
}
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
int seqSize = 1;
void DFS(pair<int, int> here)
{
ch[seqSize++] = board[here.first][here.second];
res = max(res, seqSize);
//cout << endl;
//cout << "ํ์ฌ ch ์ํ " << endl;
//for (int i = 1; i <= seqSize; ++i)
//{
// cout << ch[i] << " ";
//}
//cout << endl;
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > r || nx > c)
continue;
if (visited[ny][nx] == 1)
continue;
bool flag = false;
for (int j = 1; j <= seqSize; ++j)
{
if (ch[j] == board[ny][nx])
{
flag = true;
break;
}
}
if (flag == true)
continue;
visited[ny][nx] = 1;
DFS({ ny, nx });
visited[ny][nx] = 0;
ch[--seqSize] = ' ';
}
}
void solve()
{
DFS({ 1, 1 });
cout << res - 1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}