본문 바로가기
알고리즘/BOJ

[BOJ] 15663. N과 M (9)

by hyerann 2019. 4. 20.

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

 

15663번: N과 M (9)

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

www.acmicpc.net

앞의 문제들과는 다르게, 중복되는 수가 입력되지만 중복되는 수열을 출력하면 안되기 때문에 같은 자리에서 같은 수가 나오면 skip 해주는 코드를 추가해주어야 한다.

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

int N, M, numbers[8], visited[8];
vector<int> series;
void dfs(int idx, int cnt);
void print();

int main() {
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		cin >> numbers[i];
	}
	sort(numbers, numbers + N);
	dfs(0, 0);
	return 0;
}

void dfs(int idx, int cnt) {
	if (cnt == M) {
		print();
		return;
	}

	for (int i = 0; i < N; i++) {
		if (!visited[i]) {
			visited[i] = true;
			series.push_back(numbers[i]);
			dfs(i + 1, cnt + 1);
			visited[i] = false;
			series.pop_back();
			// 중복되는 수열을 피하기 위해
			int repeat = 0, nextIdx = 1;
			while (numbers[i] == numbers[i + nextIdx]) {
				repeat++;
				nextIdx++;
			}
			i += repeat;
		}
	}
}

void print() {
	for (int i = 0; i < M; i++) {
		cout << series[i] << ' ';
	}
	cout << "\n";
}

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

[BOJ] 15665. N과 M (11)  (0) 2019.04.21
[BOJ] 15664. N과 M (10)  (0) 2019.04.21
[BOJ] 15657. N과 M (8)  (0) 2019.04.19
[BOJ] 15655. N과 M (7)  (0) 2019.04.18
[BOJ] 15655. N과 M (6)  (0) 2019.04.17

댓글