728x90
N과 M (12) 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초 | 512 MB | 3129 | 2484 | 2111 | 81.286% |
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- N개의 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1 복사
3 1 4 4 2
예제 출력 1 복사
2 4
예제 입력 2 복사
4 2 9 7 9 1
예제 출력 2 복사
1 1 1 7 1 9 7 7 7 9 9 9
예제 입력 3 복사
4 4 1 1 2 2
예제 출력 3 복사
1 1 1 1 1 1 1 2 1 1 2 2 1 2 2 2 2 2 2 2
N과 M 시리즈의 12번째 문제이다.
크게 어려울 것은 없었고 항상 풀듯이 dfs를 이용해 풀었다.
중복을 피하기 위해 map을 이용해서 배열에 대한 정보를 key 값으로 value를 설정해 풀었다.
C++ 코드
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
int N, M;
vector<int> inp;
vector<int> res;
map<vector<int>, int> m;
void dfs(int idx)
{
if (res.size() == M) {
if (m[res] != 0) return;
m[res]++;
for (int i = 0; i < M; i++)
cout << res[i] << " ";
cout << "\n";
return;
}
for (int i = idx; i < N; i++) {
if (inp[idx] > inp[i]) continue;
res.push_back(inp[i]);
dfs(i);
res.pop_back();
}
}
int main()
{
cin >> N >> M;
for (int tmp, i = 0; i < N; i++) {
cin >> tmp;
inp.push_back(tmp);
}
sort(inp.begin(), inp.end());
dfs(0);
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 퇴사 (14501번) (0) | 2020.07.14 |
---|---|
[백준] 문자열 폭발 (9935번) (0) | 2020.07.13 |
[백준] A → B (16953번) (0) | 2020.07.13 |
[백준] 작업 (2056번) (0) | 2020.07.05 |
[백준] N과 M (9) (15663번) (0) | 2020.07.04 |