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

SW/๋ฐฑ์ค€

[๋ฐฑ์ค€] 15663๋ฒˆ N๊ณผ M(9) (C++)

 

๋ชฉ์ฐจ

0. ์„œ๋ก 

1. ๋ฌธ์ œ ๋ฐฉํ–ฅ

2. ์ฝ”๋“œ

 

0. ์„œ๋ก 

์ œํ•œ์‹œ๊ฐ„ 1์ดˆ

๋ฉ”๋ชจ๋ฆฌ 512MB


๋ฌธ์ œ

N๊ฐœ์˜ ์ž์—ฐ์ˆ˜์™€ ์ž์—ฐ์ˆ˜ M์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ธธ์ด๊ฐ€ M์ธ ์ˆ˜์—ด์„ ๋ชจ๋‘ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N๊ณผ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ M ≤ N ≤ 8)

๋‘˜์งธ ์ค„์— N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

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

์ˆ˜์—ด์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.


๊นŒ์ง€๊ฐ€ ๋ฌธ์ œ๋‹ค. ํ•„์ž๊ฐ€ ํ‘ธ๋Š” ์‹œ์ ์—์„œ๋Š” ์‹ค๋ฒ„2์˜€๋‹ค.

์—ญ์‹œ N๊ณผ M ์‹œ๋ฆฌ์ฆˆ๋Š”, ๊ณจ๋“œ ์ดํ›„์˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ์— ํฐ ๋ฐœ๋‹์›€์ด ๋˜๋Š” ๋ฌธ์ œ๋“ค์ด ๋งŽ๋‹ค.

์ด ๋ฌธ์ œ ๋˜ํ•œ ๊ทธ๋žฌ๋‹ค.

 

1. ๋ฌธ์ œ๋ฐฉํ–ฅ

ํ•„์ž์˜ ์ƒ๊ฐ ํ๋ฆ„์ด ๊ถ๊ธˆํ•˜์ง€ ์•Š๊ณ , ๋ฌธ์ œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์•„๋ž˜์˜ ๊บพ์–ด์ง„ ๊ตฌ๋ถ„์„  ์•„๋ž˜๋ถ€ํ„ฐ ๋ณด๋ฉด ๋œ๋‹ค.

 

์ฒ˜์Œ์— ์ด ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ, "์ค‘๋ณต๋˜๊ณ  ์—ฐ์†๋˜์ง€ ์•Š์€ ์ˆ˜"๊ฐ€ ์ฃผ์–ด์ง€๋ฉด์„œ "์ˆ˜์—ด์ด ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค"๊ฐ€ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ•  ์ง€ ๊ฐ์ด ์•ˆ์žกํ˜”๋‹ค. ์šฐ์„  N๊ณผ M์€ 8๋ณด๋‹ค ์ž‘๊ธฐ์— ์ˆ˜๊ฐ€ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š๊ธฐ์—, ๊ฐ ์ž๋ฆฌ๋ณ„๋กœ ๊ฐœ์ˆ˜๋ฅผ ๋ฉ•์ด๊ณ  ๋ถ„๋ฐฐํ• ๋ ค ํ–ˆ๋”๋‹ˆ ๊ทธ๋Ÿผ ์ถœ๋ ฅ์„ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๊ณ  ํ™•์ธํ•ด์•ผ๋งŒ ๋™์ผํ•œ ์ถœ๋ ฅ์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๋“ฏ ํ–ˆ๋‹ค.



๊ทธ๋Ÿผ dfs์ฒ˜๋Ÿผ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ๊ฑธ ๋•Œ, ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด ๋ณด์•˜๋‹ค.

 

์šฐ์„ , ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถœ๋ ฅ์ด "์ฆ๊ฐ€ํ•˜๋Š” ์‚ฌ์ „ ์ˆœ"์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ž…๋ ฅ๋ฐ›์€ ํ…Œ์ด๋ธ”์€ ๋ชจ๋‘ sort๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

๊ฒน์น˜๋Š” ๊ฒฝ์šฐ 1)

 

๋งŒ์ผ M์ด 2์ด๊ณ , ์œ„์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์ด ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์žฌ๊ท€์—์„œ ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์ธ 1์„ ๊ณ ๋ฅธ ํ›„, ๋‹ค์Œ ์žฌ๊ท€๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด

์ฒ˜๋Ÿผ [1 9]๊ฐ€ ๊ฒน์น˜๊ฒŒ ๋œ๋‹ค.

 

 

๊ฒน์น˜๋Š” ๊ฒฝ์šฐ 2)

๋„ค ๋ฒˆ์งธ์ธ 9๋ฅผ ์žก์•˜์„ ๋•Œ, 

 

"๋ณธ์ธ"์ธ 9๋Š” ๋„˜๊ฒผ์ง€๋งŒ, "๋ณธ์ธ ๋‹ค์Œ"์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ™์€ ์ˆ˜ 9๋ฅผ ๋˜๋‹ค์‹œ ์งš๋Š” ๊ฒฝ์šฐ๋Š” [9 9]๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ [9 9]๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅํ•˜๊ฒŒ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๋ฉด, ๋‹ค์Œ์˜ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ3์—์„œ ๋˜ ๊ฒน์น  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 

๊ฒน์น˜๋Š” ๊ฒฝ์šฐ 3)

 

์•ž์„œ์„œ [9 9]๋ฅผ print ํ–ˆ์ง€๋งŒ, ๋‹ค์„ฏ ๋ฒˆ์งธ์˜ 9๋ฅผ ์งš๊ฒŒ ๋˜๋ฉด, ์•ž์„œ ์ถœ๋ ฅํ•œ [9 9]๊ฐ€ ๋˜ ์ถœ๋ ฅ๋˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๊ฒฐ

์ฝ”๋“œ๋ฅผ ๋ณด๊ณ ์‹ถ์€ ์‚ฌ๋žŒ์€ ๊ทธ๋ƒฅ ๋‹ค์Œ index๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋Š” ๊ตฌ์กฐ์ ์ธ ๋‚ด์šฉ์„ ๋‹ค๋ฃฌ๋‹ค.

์šฐ์„ , [1 1]๊ณผ ๊ฐ™์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋Š”

vector<int> stack;
vector<bool> visited;

void logic(int depth) {
	for(int i = 0; i < (int)depth.size(); ++i) {
    	if(!visited[i]) {
        	visited[i] = true;
            logic(depth + 1);
            visited[i] = false;
        }
    }
}

 

์ด๋Ÿฐ dfs์˜ ๊ธฐ๋ณธ visited๊ตฌ์กฐ๋กœ ํ”ผํ•  ์ˆ˜ ์žˆ๊ณ ,

 

๊ฒน์น˜๋Š” ๊ฒฝ์šฐ 1,2,3์„ ๋ชจ๋‘ ํƒ€๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

๊ฒน์น˜๊ธฐ ์ง์ „๊ณผ ๊ฒน์นœ ํ›„์˜ ๋™์ž‘๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณด๊ณ ์žˆ์ž๋ฉด,

"์ „์— ์„ ํƒํ•œ ์„ ํƒ์„ ๋‹ค์‹œ ์„ ํƒํ•˜์ง€ ์•Š๊ฒŒ"ํ•˜๋Š” ๊ฒƒ ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N,M;
vector<int> table;
vector<int> stack;
vector<bool> visited;

void init() {
    int temp;
    cin >> N >> M;

    visited.resize(N, false);

    for(int i = 0; i < N; ++i) {
        cin >> temp;
        table.push_back(temp);
    }
    sort(table.begin(), table.end());
}

์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์„ ๋ฐ›์•„์ค€ ํ›„,

 

void logic(int depth) {
    if(depth >= M) {
        return;
    }

    int bef = 0;

    for(int i = 0; i < (int)table.size(); ++i) {
        if(!visited[i] && table[i] != bef) {
            bef = table[i];
            
            visited[i] = true;
            stack.push_back(table[i]);
            
            logic(depth+1);
            
            visited[i] = false;
            stack.pop_back();
        }
    }
}

์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์งœ ๋‚ด๋ ค๊ฐ€๋ฉด ๋œ๋‹ค.

 

๋ฌผ๋ก  ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋А๋ผ print ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ œ์™ธํ–ˆ๊ณ , if return ๋ถ€๋ถ„์— printํ•˜๋Š” ๋กœ์ง์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

2. ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N,M;
vector<int> table;
vector<int> stack;
vector<bool> visited;

void init() {
    int temp;
    cin >> N >> M;

    visited.resize(N, false);

    for(int i = 0; i < N; ++i) {
        cin >> temp;
        table.push_back(temp);
    }
    sort(table.begin(), table.end());
}

void logic(int depth) {
    if(depth >= M) {
        for(int i = 0; i < (int)stack.size(); ++i) {
            cout << stack[i] << " ";
        }
        cout << '\n';
        return;
    }

    int bef = 0;

    for(int i = 0; i < (int)table.size(); ++i) {
        if(!visited[i] && table[i] != bef) {
            bef = table[i];
            visited[i] = true;
            stack.push_back(table[i]);
            logic(depth+1);
            visited[i] = false;
            stack.pop_back();
        }
    }
}



int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    init();
    logic(0);

    return 0;
}

 

์ž…์ถœ๋ ฅ ๊ฐ€์†์˜ ๊ฒฝ์šฐ 4ms๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.