๐Ÿ•๏ธ ICPC Sinchon/Divide and Conquer

[BOJ][C++] ๋ฐฑ์ค€ 18222๋ฒˆ: ํˆฌ์—-๋ชจ์Šค ๋ฌธ์ž์—ด

์„ ๋‹ฌ 2024. 8. 21. 01:16
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด๊ฐ€ ๋ฌดํ•œํ•œ ๋ฌธ์ž์—ด X๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  1. X๋Š” ๋งจ ์ฒ˜์Œ์— "0"์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. 
  2. X์—์„œ 0์„ 1๋กœ, 1์„ 0์œผ๋กœ ๋’ค๋ฐ”๊พผ ๋ฌธ์ž์—ด X'์„ ๋งŒ๋“ ๋‹ค.
  3. X์˜ ๋’ค์— X'๋ฅผ ๋ถ™์ธ ๋ฌธ์ž์—ด์„ X๋กœ ๋‹ค์‹œ ์ •์˜ํ•œ๋‹ค. 
  4. 2~3์˜ ๊ณผ์ •์„ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ฆ‰, X๋Š” ์ฒ˜์Œ์— "0"์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ "01"์ด ๋˜๊ณ , "0110"์ด ๋˜๊ณ , "01101001"์ด ๋˜๊ณ , โ‹ฏ ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ด์–ด์ง„๋‹ค.

    "011010011001011010010110011010011001011001101001โ‹ฏโ‹ฏ"

์ž์—ฐ์ˆ˜ k๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ X์˜ k๋ฒˆ์งธ์—๋Š” ๋ฌด์Šจ ๋ฌธ์ž๊ฐ€ ์˜ค๋Š”์ง€ ๊ตฌํ•˜์—ฌ๋ผ.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ k (1 ≤ k ≤ 1018) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— k๋ฒˆ์งธ์— ์˜ค๋Š” ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

 

ํ’€์ด

์•„๋ž˜ '์‹œํ–‰์ฐฉ์˜ค' ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‹จ์ˆœ ๊ตฌํ˜„์„ ํ–ˆ๋”๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค.

๊ณต๊ฐ„๋ณต์žก๋„์™€ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‘˜ ๋‹ค ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•˜์ž

 

๋˜ํ•œ K์˜ ๋ฒ”์œ„๋Š” 0~10^8์ด๋‹ค. 10^18๊ณผ ๊ทผ์‚ฌํ•œ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์€ 2^66 ์ •๋„๋กœ

int๋กœ ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋‹ค

์ฝ”๋“œ ์ „๋ฐ˜์— long long ์„ ์ด์šฉํ•˜์ž

 

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

long long recur(long long k) {
    if(k==1) {
        return 0;
    }
    
    long long pow_of_2 = 1;
    while(k>pow_of_2) {
        pow_of_2 *= 2;
    }
    
    return 1 - recur(k-pow_of_2/2);
}

int main() {
    long long k;
    cin >> k;
    
    cout << recur(k);
    
    return 0;
}

 

 

 

์‹œํ–‰์ฐฉ์˜ค

 

๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋œจ๋Š” ๋‹จ์ˆœ ๊ตฌํ˜„ ์ฝ”๋“œ

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

string get_new_string(string s) {
    string new_string = "";
    for(char c : s) {
        if(c=='0') new_string += '1';
        else new_string += '0';
    }
    return new_string;
}

int main() {
    int k;
    cin >> k;
    
    int length = 0;
    string s = "0";
    while(length < k) {
        length += s.size();
        s += get_new_string(s);
    }
    
    cout << s[k-1];
    
    return 0;
}

 

๊ทธ๋ž˜์„œ ๋ถ„ํ• ์ •๋ณต์œผ๋กœ ๊ฐœ์„ ํ•œ ์ฝ”๋“œ.

ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œฌ๋‹ค

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int recur(int k) {
    if(k==1) {
        return 0;
    }
    
    int pow_of_2 = 1;
    while(k>pow_of_2) {
        pow_of_2 *= 2;
    }
    
    return 1 - recur(k-pow_of_2/2);
}

int main() {
    int k;
    cin >> k;
    
    cout << recur(k);
    
    return 0;
}
๋ฐ˜์‘ํ˜•