[c++] BOJ 1987 :: ์•ŒํŒŒ๋ฒณ

๋‚œ์ด๋„ : ๊ณจ๋“œ 4

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 40๋ถ„

 

๋ฌธ์ œ

์•ŒํŒŒ๋ฒณ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 256 MB 49866 15734 9600 29.155%

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค.

๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ ์ด๋™ํ•œ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ ํžŒ ์นธ์„ ๋‘ ๋ฒˆ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์‹œ์ž‘ํ•ด์„œ, ๋ง์ด ์ตœ๋Œ€ํ•œ ๋ช‡ ์นธ์„ ์ง€๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ง์ด ์ง€๋‚˜๋Š” ์นธ์€ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์นธ๋„ ํฌํ•จ๋œ๋‹ค.

 

ํ’€์ด

  • ์ฃผ์˜! ์ž…๋ ฅ์ด 20์ด๋ฏ€๋กœ ์ ์ง€๋งŒ ๊ฒฝ๋กœ ๋ฌธ์ œ์ด๋ฏ€๋กœ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
  • DFS๋ฅผ ์‚ฌ์šฉ
  • ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ์•ŒํŒŒ๋ฒณ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
    • unordered_set
    • int ๋ฐฐ์—ด

 

์ฝ”๋“œ

#include <iostream>
#include <queue>

using namespace std;

int direction[4][2] = { {0,1}, {1,0}, {0, -1}, {-1, 0} };
int R, C;
char arr[21][21];
int visited[26];
int res = -1;

void dfs(int r, int c, int num) {
    res = res < num ? num : res;

    for (int i = 0; i < 4; i++) { // ์ƒํ•˜์ขŒ์šฐ ๋Œ๋ฉด์„œ
        int rp = r + direction[i][0];
        int cp = c + direction[i][1];
        if (rp < 0 || cp < 0 || rp >= R || cp >= C) // ๋งต ๋ฐ–์— ์œ„์น˜ํ•˜๋ฉด ์ œ์™ธ
            continue;
        if (!visited[arr[rp][cp]-'A']) {
            // ๊ฒฝ๋กœ์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ณณ์€ ์ œ์™ธ
            visited[arr[rp][cp] - 'A'] = 1;
            num++;
            dfs(rp, cp, num);
            num--;
            visited[arr[rp][cp] - 'A'] = 0;
        }
    }
}

int main() {
    // ์ž…๋ ฅ ๋ฐ›๊ธฐ
    cin >> R >> C;
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> arr[i][j];
        }
    }

    fill(&visited[0], &visited[25], 0); // ์ดˆ๊ธฐํ™”
    visited[arr[0][0]-'A'] = 1;
    dfs(0, 0, 1);
    cout << res << '\n';
}

 

์ฃผ์˜ํ•  ์ 

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ํ•ด๋‹น ์œ„์น˜์—์„œ์˜ ๊ฐ€๋Šฅ ์ตœ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์ด์ „ ๊ฒฝ๋กœ์— ์ข…์†์ ์ด๋ฏ€๋กœ (ํ•ด๋‹น ์œ„์น˜๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์•ž์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋„ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ) ๋ถˆ๊ฐ€๋Šฅ
  • unordered_set์œผ๋กœ ์ €์žฅํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜ด => ๊ธฐ๋ณธ ๋ฐฐ์—ด๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
    • unordered_set์˜ ์‚ฝ์ž… ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)์™€ find ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋ฐฐ์—ด๋กœ ํ•˜๋ฉด ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์ด ์ด๋ฏธ ๋‚˜์™”๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•