๐Ÿ“ฆ Chango/๐Ÿฃ EDOC

[BOJ][C++] ๋ฐฑ์ค€ 1074๋ฒˆ: Z

์„ ๋‹ฌ 2021. 9. 7. 15:38
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/1074

 

1074๋ฒˆ: Z

ํ•œ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2N × 2N์ธ 2์ฐจ์› ๋ฐฐ์—ด์„ Z๋ชจ์–‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2×2๋ฐฐ์—ด์„ ์™ผ์ชฝ ์œ„์นธ, ์˜ค๋ฅธ์ชฝ ์œ„์นธ, ์™ผ์ชฝ ์•„๋ž˜์นธ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์นธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด Z๋ชจ์–‘์ด๋‹ค. N > 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„

www.acmicpc.net

 

๋ฌธ์ œ

ํ•œ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2N × 2N์ธ 2์ฐจ์› ๋ฐฐ์—ด์„ Z๋ชจ์–‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2×2๋ฐฐ์—ด์„ ์™ผ์ชฝ ์œ„์นธ, ์˜ค๋ฅธ์ชฝ ์œ„์นธ, ์™ผ์ชฝ ์•„๋ž˜์นธ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์นธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด Z๋ชจ์–‘์ด๋‹ค.

N > 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„ ํฌ๊ธฐ๊ฐ€ 2N-1 × 2N-1๋กœ 4๋“ฑ๋ถ„ ํ•œ ํ›„์— ์žฌ๊ท€์ ์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

๋‹ค์Œ ์˜ˆ๋Š” 22 × 22 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ์ด๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, rํ–‰ c์—ด์„ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋‹ค์Œ์€ N=3์ผ ๋•Œ์˜ ์˜ˆ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N, r, c๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

rํ–‰ c์—ด์„ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • 1 ≤ N ≤ 15
  • 0 ≤ r, c < 2N

ํ’€์ด

 

#include <iostream>

using namespace std;

long long ans=0;

void z(int x, int y, int n){
    
    if(n == 0){
        return;
    }
    
    //2^n ๊ตฌํ•˜๊ธฐ (side)
    int side = 1;
    for(int i=0; i<n; i++){
        side *= 2;
    }
    int star = side/2 - 1;      //2^(n-1)-1 ๊ตฌํ•˜๊ธฐ (์‚ฌ๋ถ„๋ฉด์„ ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€์ )
    long long square = (side/2)*(side/2);  //2^(n-1) * 2^(n-1) ๊ตฌํ•˜๊ธฐ (ํ•œ ์‚ฌ๋ถ„๋ฉด์˜ ๋„“์ด)
        
    //์‚ฌ๋ถ„๋ฉด ํŒ์ • ํ›„ ๊ณ„์‚ฐ
    int new_x, new_y, new_n;
    
    if(x<=star && y<=star){
        new_x = x; new_y = y;
        ans += 0;
    }
    else if(x>star && y<=star){
        new_x = x-(star+1); new_y = y;
        ans += square;
    }
    else if(x <= star && y > star){
        new_x = x; new_y = y - (star+1);
        ans += 2 * square;
    }
    else if(x > star && y > star) {
        new_x = x-(star+1); new_y = y-(star+1);
        ans += 3 * square;
    }
    
    new_n = n--;

    z(new_x,new_y,n--);
}

int main() {
    int n, x, y;
    cin >> n >> y >> x;

    z(x,y,n);

    cout << ans;
    
    return 0;
}

 

TIL

ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต๋ฌธ์— ๋Œ๋ฆฌ๋Š”๊ฒƒ๊ณผ ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅด๋‹ค.... ใ… ใ… 

๋ฐ˜์‘ํ˜•