๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Code Tree

[์ฝ”๋“œํŠธ๋ฆฌ] Backtracking - ๋ฐฑํŠธ๋ž˜ํ‚น / ์žฌ๊ท€ ์—ฐ์Šต๋ฌธ์ œ

 

๋ฐฑํŠธ๋ž˜ํ‚น.

๋Œ€์ถฉ ์•Œ๊ณ ์žˆ๋Š”๊ฑด

๋ฐฑํŠธ๋ž˜ํ‚น == ์™„์ „ํƒ์ƒ‰(๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฌด์‹ํ•˜๊ฒŒ ์ฐพ๊ธฐ)์—์„œ ๊ฐ€์ง€์น˜๊ธฐ๋กœ ํšจ์œจ ๋†’์ž„

์ด์ •๋„๋ผ์„œ..ใ…‹ใ…‹ ์—ฐ์Šต๋ฌธ์ œ๋„ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค

 


 

๋Œ€๋ถ€๋ถ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์€ ์›ํ•˜๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด ๊ทธ ์ค‘ ๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ๋‹ต์„ ๊ณ ๋ฅด๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ n ์ œํ•œ์ด ์ž‘๊ณ , ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ œํ•œ ์‹œ๊ฐ„๋ณด๋‹ค ๋” ์ž‘๋‹ค๋ฉด, ํ•ญ์ƒ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋‹ค ๋งŒ๋“ค์–ด ๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋‚˜, ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ž…์žฅ์—์„œ ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ, (1, 1, 1, 1, 1), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 2, 1), (1, 1, 1, 2, 2), .. ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€๋Šฅํ•œ ์ˆœ์—ด๊ณผ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ for๋ฌธ ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ๋งŽ์€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋ชจ๋“  ์ˆœ์—ด๊ณผ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฌ๊ท€ํ•จ์ˆ˜๋Š” ํฌ๊ฒŒ ์ข…๋ฃŒ ์กฐ๊ฑด๊ณผ ์žฌ๊ท€ ํ˜ธ์ถœ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

 

nํฌ๊ธฐ์˜ ๋ฐฐ์—ด์— 0๊ณผ 1์„ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด๊ฐ€๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์นฉ์‹œ๋‹ค.

๋งŒ์•ฝ ์žฌ๊ท€์—์„œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ n์— ์ด๋ฅด๋ฉด, ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉฐ ์ถœ๋ ฅ ํ›„ return๋ฅผ ํ†ตํ•ด ํ‡ด๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜์—์„œ๋Š” ํ‡ด๊ฐ์„ ์ง„ํ–‰ํ•  ๋•Œ, ์ง„์ž… ์ง์ „์— arr์— ์ ์—ˆ๋˜ ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ๋นผ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๊ทธ ๋‹ค์Œ ์ˆซ์ž์— ๋Œ€ํ•ด ๊ณต์ •ํ•˜๊ฒŒ ๊ธฐํšŒ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด ์›ํ•˜๋Š” ์ˆซ์ž๋“ค์„ ์ „๋ถ€ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 


์—ฐ์Šต๋ฌธ์ œ : k๊ฐœ ์ค‘์— 1๊ฐœ๋ฅผ n๋ฒˆ ๋ฝ‘๊ธฐ

์ด์ƒ ์ดํ•˜์˜ ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ๊ณ ๋ฅด๋Š” ํ–‰์œ„๋ฅผ ๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ์Œ์„ ๊ตฌํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์ด ์ธ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์˜ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ํ˜•์‹

์ฒซ์งธ ์ค„์— ์™€ ์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ์Œ์˜ ๊ฐœ์ˆ˜ ๋งŒํผ์˜ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ˆœ์„œ์Œ์˜ ์ƒํƒœ๋ฅผ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ดค์„ ๋•Œ ์‚ฌ์ „์ˆœ์œผ๋กœ ์•ž์„  ์ˆœ์„œ์Œ๋ถ€ํ„ฐ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


๋‚˜์˜ ํ’€์ด

// ํ‹€๋ฆฐ ์ฝ”๋“œ

int k; int n;
vector<int> nums;

void printNums(){
    for(int i=0; i<nums.size(); ++i){
        cout << nums[i] << " ";
    }
    cout << "\n";
}

int getNums(int cnt){
    if(cnt==n){
        printNums();
        return 0;
    }
    for(int i=1; i<=k; ++i){
        nums.push_back(i); // ์ฒซ ๊ฐ’์„ ๋„ฃ๊ณ 
        getNums(cnt+1); // ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜๋ณต
    }
}

int main() {
    cin >> k >> n;

    getNums(0);

    return 0;
}

๋ญ์•ผ ์™œ์ด๋ž˜

์•Œ๊ณ ๋ณด๋‹ˆ

getNums๋กœ ์ˆซ์ž๋ฅผ ๋ฐ›์•„์˜จ ๋’ค์— ๋‹ค์Œ ํ„ด์„ ์œ„ํ•ด์„œ ๋‹ค์‹œ popํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ๊ทธ๊ฑธ ๋นผ๋จน์—ˆ๋‹ค.

 

int getNums(int cnt){
    if(cnt==n){
        printNums();
        return 0;
    }
    for(int i=1; i<=k; ++i){
        nums.push_back(i); // ์ฒซ ๊ฐ’์„ ๋„ฃ๊ณ 
        getNums(cnt+1); // ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜๋ณต
        nums.pop_back(); // ๋ชจ๋‘ ๋ฐ›์•„์˜จ ํ›„์— popํ•ด์ฃผ๊ธฐ
    }
}

 

์ด๋ ‡๊ฒŒ ๊ณ ์ณ์ฃผ๋‹ˆ ์„ฑ๊ณต! ํ•จ์ˆ˜๋Š” ํ•œ ๊ธฐ๋Šฅ๋งŒ ํ•˜๋Š”๊ฒŒ best๋ผ์„œ, ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ๋นผ๋†“๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•จ

์žฌ๊ท€ ์€๊ทผ ์–ด๋ ต๋‹ค.

์—ฐ์Šต ๋งŽ์ด ํ•ด์•ผ๊ฒ ์Œ ๐Ÿ˜ข