[c++] BOJ 17370 :: ์œก๊ฐํ˜• ์šฐ๋ฆฌ ์†์˜ ๊ฐœ๋ฏธ

๋ฌธ์ œ

์œก๊ฐํ˜• ์šฐ๋ฆฌ ์†์˜ ๊ฐœ๋ฏธ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฏธ๊ฐ€ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋˜, ์ฆ‰, ํŽ˜๋กœ๋ชฌ์ด ๋ฟŒ๋ ค์ง„ ์ง€์ ์— ๋„์ฐฉํ•˜๋ฉด ์ด๊ณณ์ด ์ด๋ฏธ ์ต์ˆ™ํ•œ ์˜์—ญ์ด๋ผ๋Š” ์ฐฉ๊ฐ์— ๋น ์ง€๊ณ  ๋” ์ด์ƒ์˜ ํƒ์ƒ‰์„ ๋ฉˆ์ถ˜๋‹ค. ์ด๋ ‡๊ฒŒ ํƒ์ƒ‰์„ ๋ฉˆ์ท„์„ ๋•Œ, ๋ฐฉํ–ฅ์„ ํšŒ์ „ํ•œ ํšŸ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ N๋ฒˆ์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž.

 

ํ’€์ด

๊ฐœ๋ฏธ๊ฐ€ ์œ„์น˜ํ•œ ์œก๊ฐํ˜•์˜ ์ ์— ๋”ฐ๋ผ TYPE1, TYPE2๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์œก๊ฐํ˜•์„ ์ด๋ ‡๊ฒŒ 3์ฐจ์›์˜ ์ •์‚ฌ๋ฉด์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋‹ค์Œ์€ ๊ฐ๊ฐ x์ถ•์œผ๋กœ +1, y์ถ•์œผ๋กœ +1, z์ถ•์œผ๋กœ +1์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ† ๋Œ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

  • (0, 0, 0)์„ ์ด๋ฏธ ๋“ค๋ฅด๊ณ , z์ถ• ์ด๋™ํ•œ ๊ฒƒ(0, 0, 1)์œผ๋กœ ์ฒ˜์Œ ์ด๋™์„ ๊ณ ์ •ํ•œ๋‹ค.
  • ๋‹ค์Œ ์ด๋™๋ถ€ํ„ฐ๋Š” TYPE์— ๋”ฐ๋ผ 3๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋งŒ์ผ ํ˜„์žฌ TYPE 1์˜ x์ถ• ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด,
    • ๋‹ค์Œ ํ„ด์— TYPE 2์˜ ๋ฐฉํ–ฅ๋“ค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ 
    • TYPE 2์˜ ๋ฐฉํ–ฅ ์ค‘ x์ถ• ๋ฐฉํ–ฅ(๋ฐฉ๊ธˆ ๊ฑด๋„ˆ์˜จ ๋ฐฉํ–ฅ)์œผ๋กœ๋Š” ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
    • ๋”ฐ๋ผ์„œ ๊ฐ TYPE์˜ ๋ฐฉํ–ฅ์ด 3๊ฐ€์ง€์ด๋ฏ€๋กœ, ๊ฐ ํ„ด์— ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฏธ์˜ ์ง„ํ–‰๋ฐฉํ–ฅ์€ 2๊ฐ€์ง€์ด๋‹ค.
  • ์ด๋™ ์ค‘์— ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด
    • ํ˜„์žฌ ๋ฐฉํ–ฅ ์ „ํ™˜ ํšŸ์ˆ˜๊ฐ€ ๋ชฉํ‘œํ•œ ๋ฐฉํ–ฅ ์ „ํ™˜ ํšŸ์ˆ˜์ธ์ง€ ํ™•์ธํ•˜๊ณ 
      • ๋งž๋‹ค๋ฉด ์ •๋‹ต์˜ ๊ฐœ์ˆ˜๋ฅผ +1ํ•œ๋‹ค.
      • ์•„๋‹ˆ๋ผ๋ฉด ํƒ์ƒ‰์„ ๋งˆ์นœ๋‹ค.
  • ์ด๋™ ์ค‘ ๋ชฉํ‘œํ•œ ๋ฐฉํ–ฅ ์ „ํ™˜ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ํƒ์ƒ‰์„ ๋งˆ์นœ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>

using namespace std;

int directionTypeOne[3][3] = { {-1, 0, 0}, {0, -1, 0}, {0, 0, -1} };
int directionTypeTwo[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };

int N;
int result = 0;
int visited[46][46][46]; // ์Œ์ˆ˜๊นŒ์ง€ ํ‘œํ˜„

bool isInitialPos(int x, int y, int z) {
    return (x == 0) && (y == 0) && (z == 0);
}

void dfs(int x, int y, int z, bool type, int xyzWhich, int cnt) {
    if (visited[x + 22][y + 22][z + 22] == 1) { // ์ด์ „์— ๋ฐฉ๋ฌธ ํ•œ ๊ณณ
        if (cnt == N)
            result++;
        return; // ํƒ์ƒ‰ ๋
    }

    if (cnt > N) {
        return;
    }

    visited[x + 22][y + 22][z + 22] = 1;

    auto directionArr = (type ? directionTypeOne : directionTypeTwo);
    for (int i = 0; i < 3; i++) {
        if (i == xyzWhich) continue; // ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š์Œ

        int xNew = x + directionArr[i][0];
        int yNew = y + directionArr[i][1];
        int zNew = z + directionArr[i][2];

        dfs(xNew, yNew, zNew, !type, i, cnt+1);
    }

    visited[x + 22][y + 22][z + 22] = 0;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    // N๋ฒˆ๋งŒ์— ๊ฐœ๋ฏธ๋Š” ์ œ์ž๋ฆฌ๋กœ ๋Œ์•„์™€์•ผ ํ•จ
    // ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๊ฒฝ๋กœ๋„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ => ์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœ์„œ
    // ๋ฐฉํ–ฅ์€ ์ฒ˜์Œ์—” 3๊ฐ€์ง€, ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋ณธ์ธ์ด ์˜จ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ 2๊ฐ€์ง€ (x, y, z๋กœ ์ƒ๊ฐ)

    cin >> N;
    fill(&visited[0][0][0], &visited[45][45][46], 0);
    visited[22][22][22] = 1; // ์‹œ์ž‘์  => ์ฃผ์˜!
    dfs(0, 0, 1, true, 2, 0);// ์ฒซ๋ฒˆ์งธ ๊ฒฝ๋กœ๋Š” ๊ณ ์ •
    cout << result;
}

 

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2400 44 1461
๋ฐ˜์‘ํ˜•