알고리즘/BOJ

백준 15663번 N과 M (9)

lheunoia 2021. 1. 11. 17:11

 

 

문제 보러가기 : https://www.acmicpc.net/problem/15663 

 

 

 

15663번: N과 M (9)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

 

이번 문제는 백트래킹(BackTracking) 문제였습니다.

 

 

 

 

《문제 풀이》

 

1. N개의 수를 중복없이 담을 v 벡터 

2. 중복된 수만큼 사용하기 위해 cnt[10000] 배열 선언

3. result[0] 부터 시작하기 위해 NandM(0) 호출

4. result 배열에 수를 저장할 때마다 cnt[v[i]]-- 

5. 재귀 호출 후, 다시 cnt[v[i]]++ 

 

 

 

C++ 코드》

 

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

using namespace std;

int N, M;
vector<int> v;
int result[8];
int cnt[10000];

void NandM(int idx){
	if(idx == M){
		for(int i=0; i<M; i++){
			cout<<v[result[i]]<<" ";
		}
		cout<<"\n";
		return;
	}
	
	for(int i=0; i<N; i++){
		if(cnt[v[i]]){ //0이 아니라면  
			result[idx] = i;
			cnt[v[i]]--;
			NandM(idx+1);
			cnt[v[i]]++; //재귀호출 후 다시 증가  
		}
	}
}

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

	cin>>N>>M;
	
	for(int i=0; i<N; i++){
		int num;
		cin>>num;
		
		if(cnt[num] == 0){ //0이라면  
			cnt[num] = 1;
			v.push_back(num);
		}
		else{ //0이 아니라면 벡터에 저장하지 않음  
			cnt[num]++;
		}
	}
	
	sort(v.begin(), v.end());
	NandM(0);
		
	return 0;
}

 

 

개발 환경: Dev-C++

 

 

 

baekjoon - 정답 화면

 

 

 

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 12851번 숨바꼭질 2  (0) 2021.01.16
백준 16953번 A → B  (0) 2021.01.16
[백준] 15654번 N과 M (5) C++  (0) 2021.01.09
[백준] 15650번 N과 M (2) C++  (0) 2021.01.07
[백준] 11053번 가장 긴 증가하는 부분 수열 C++  (0) 2021.01.05