LeeTaes 공부노트

[백준 / C++] N과 M (8)(실버3, 15657) 본문

코딩테스트/백준 (Study)

[백준 / C++] N과 M (8)(실버3, 15657)

리태s 2024. 9. 15. 23:27
728x90
반응형

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

 

문제

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.

  • N개의 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
  • 고른 수열은 비내림차순이어야 한다.
    • 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

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

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 1

3 1
4 5 2

예제 출력 1

2
4
5

예제 입력 2

4 2
9 8 7 1

예제 출력 2

1 1
1 7
1 8
1 9
7 7
7 8
7 9
8 8
8 9
9 9

예제 입력 3

4 4
1231 1232 1233 1234

예제 출력 3

1231 1231 1231 1231
1231 1231 1231 1232
1231 1231 1231 1233
1231 1231 1231 1234
1231 1231 1232 1232
1231 1231 1232 1233
1231 1231 1232 1234
1231 1231 1233 1233
1231 1231 1233 1234
1231 1231 1234 1234
1231 1232 1232 1232
1231 1232 1232 1233
1231 1232 1232 1234
1231 1232 1233 1233
1231 1232 1233 1234
1231 1232 1234 1234
1231 1233 1233 1233
1231 1233 1233 1234
1231 1233 1234 1234
1231 1234 1234 1234
1232 1232 1232 1232
1232 1232 1232 1233
1232 1232 1232 1234
1232 1232 1233 1233
1232 1232 1233 1234
1232 1232 1234 1234
1232 1233 1233 1233
1232 1233 1233 1234
1232 1233 1234 1234
1232 1234 1234 1234
1233 1233 1233 1233
1233 1233 1233 1234
1233 1233 1234 1234
1233 1234 1234 1234
1234 1234 1234 1234

문제 풀이

이번 문제는 백트래킹 연습하기 좋은 N과 M 시리즈의 문제입니다.

 

입력받은 수들을 m개 뽑아 조합하면 되는 간단한 문제입니다.

핵심은 수열이 사전 순으로 증가하는 순서로 배치되어야 한다는 점이며, 이를 위해 미리 정렬을 한 뒤 간단히 추가하고 완전 탐색 로직에서 배열의 크기가 m이 될 때까지 순회하며 값을 추출해주면 풀리는 문제입니다.

 

문제의 난이도도 간단하고, 백트래킹이 감이 안오시는 분들은 N과 M 문제를 처음부터 쭉 풀어봐도 좋을 것 같습니다.

코드

더보기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<int> v;

void Go(int cnt, vector<int> nums)
{
	if (nums.size() == m)
	{
		for (int num : nums)
		{
			cout << num << " ";
		}
		cout << '\n';
		return;
	}

	for (int i = cnt; i < n; i++)
	{
		nums.push_back(v[i]);
		Go(i, nums);
		nums.pop_back();
	}
	return;
}

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

	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		int tempNum;
		cin >> tempNum;

		v.push_back(tempNum);
	}

	sort(v.begin(), v.end());

	vector<int>temp;
	Go(0, temp);
	
}
728x90
반응형