728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ปํ์ด ๊ณผ์
DFS + ๋ฐฑํธ๋ํน์ผ๋ก ํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค. ์ฒ์์๋ ๊ฐ์ ๋ฌธ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ํด set์ ์ด์ฉํ๋๋ฐ, ์๊ฐ ์ด๊ณผ๊ฐ ๋๋๋ผ๊ตฌ์. ๊ทธ๋์ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ๋๋ฐ, ์ํ๋ฒณ์ 26๊ฐ๊ฐ ์๊ณ ๊ฐ๊ฐ ํ ๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํ ์ ์์ผ๋, vector<bool> Alphabet(26, false) ๋ฐฐ์ด์ ํตํด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ ํต๊ณผ๊ฐ ๋์์ต๋๋ค.
\(\mathrm{O(1)} \) ๊ณผ \( \mathrm{O(log \ N)} \) ์ ํ์ ๋น์ฉ ์ฐจ์ด๋ฅผ ์ค๊ฐํ๋ ๋ฌธ์ ์์ต๋๋ค.
์๋ฌดํผ, ๋ค์๊ณผ ๊ฐ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์ฑํด์ ํ๋ฉด ๋ฉ๋๋ค.
- ๋ฌธ์์ด ๋ณด๋ํ ์ ๋ณด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ ํ, ํฌ๊ธฐ 26์ bool ๋ฐฐ์ด(Alphabet)์ ์ ์ธํด ๋ชจ๋ false๋ก ์ด๊ธฐํํ๋ค.
- ์์์ ๋ํ ๊ธธ์ด์ ํฌํจ๋๋ฏ๋ก, Alphabet[0][0] = true ๋ฅผ ํ๊ณ , ์์์ ์ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ DFS ํ์์ ์์ํ๋ค.
- ๋งต ๋ฐ์ ๋ฒ์ด๋๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ์ํ๋ฒณ์ธ ๊ฒฝ์ฐ, ์์ง์ธ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๊ณ ๋ค์ ๋ฐฉํฅ์ผ๋ก DFS ํ์ ์์
- (1)์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ํ๋ฒณ์ธ ๊ฒฝ์ฐ์๋ ๋ฐฉ๋ฌธ ์ฒดํฌ ํด์ฃผ๊ณ , (2)ํด๋น ์ํ๋ฒณ ์ขํ๋ถํฐ ๋ค์ ์ํ์ข์ฐ ํ์์ ์์
- (2) ํ์์ด ๋๋ฌ๋ค๋ฉด, (1) ์ํ๋ฒณ์ ๋ฐฉ๋ฌธ ํด์ ํ์(๋ฐฑํธ๋ํน)
โ๏ธ ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
using namespace std;
using Direction = pair<int, int>;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
#define ALPHABET_COUNT 26
vector<Direction> Directions { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
vector<bool> Alphabet(ALPHABET_COUNT, false);
int R, C;
void BackTracking(const vector<vector<char>>& field, int& maxStep, int currentStep, int row, int col) {
for (const auto& direction : Directions) {
int nextRow = row + direction.first;
int nextCol = col + direction.second;
if (nextRow < 0 or nextRow >= R or nextCol < 0 or nextCol >= C) {
maxStep = max(maxStep, currentStep);
continue;
}
int index = field[nextRow][nextCol] - 'A';
if (Alphabet[index]) {
maxStep = max(maxStep, currentStep);
continue;
}
Alphabet[index] = true;
BackTracking(field, maxStep, currentStep + 1, nextRow, nextCol);
Alphabet[index] = false;
}
}
int GetMaximumAlphabet(const vector<vector<char>>& field) {
int maxStep = 1;
int index = field[0][0] - 'A';
Alphabet[index] = true;
BackTracking(field, maxStep, 1, 0, 0);
return maxStep;
}
int main() {
FAST_IO
cin >> R >> C;
vector<vector<char>> field(R, vector<char>(C));
for (int r = 0; r < R; r++)
for (int c = 0; c < C; c++)
cin >> field[r][c];
int answer = GetMaximumAlphabet(field);
cout << answer;
return 0;
}
728x90
๋ฐ์ํ
'๐คAlgorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1074๋ฒ | Z (C++) (0) | 2023.12.18 |
---|---|
[BOJ] 1916๋ฒ | ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (C++) (0) | 2023.12.13 |
[BOJ] 14502๋ฒ | ์ฐ๊ตฌ์ (C++) (0) | 2023.12.13 |
[BOJ] 17472๋ฒ | ๋ค๋ฆฌ ๋ง๋ค๊ธฐ 2 (C++) (0) | 2023.12.12 |
[BOJ] 13549๋ฒ | ์จ๋ฐ๊ผญ์ง 3 (C++) (1) | 2023.12.06 |