BOJ 15650 - N과 M (2) 문제풀이
문제를 읽고 이해하기
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
재정의와 추상화
> BOJ 15649 - N과 M (1) 문제풀이
N과 M (1) 문제에서 '고른 수열이 오름차순이여야 한다.'라는 조건 하나만 더 추가된 문제이다. 따라서 result 벡터에 원소를 추가하는 부분에 오름차순인지 아닌지 확인하는 코드 2줄만 추가하면 된다.
result가 비어 있지 않은 상태에서 원소를 추가하려고 할 때, 추가하려고 하는 원소가 result 벡터의 맨 뒤에 있는 원소보다 크지 않을 경우(작거나 같을 경우) 원소를 추가하지 않고 다음 숫자로 넘어간다.
코드 작성
#include <iostream>
#include <vector>
using namespace std;
int n, m;
bool check[9];
vector<int> result;
void dfs(int count) {
if (count == m) {
for (int idx = 0; idx < m; idx++)
cout << result[idx] << ' ';
cout << '\n';
return;
}
for (int j = 1; j <= n; j++) {
if (!check[j]) {
if (!result.empty() && result.back() >= j)
continue;
result.push_back(j);
check[j] = true;
dfs(count + 1);
result.pop_back();
check[j] = false;
}
}
}
int main() {
cin.sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
dfs(0);
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
BOJ 7576 - 토마토 문제풀이 (0) | 2020.04.05 |
---|---|
BOJ 9663 - N-Queen 문제풀이 (0) | 2020.04.03 |
BOJ 15649 - N과 M (1) 문제풀이 (0) | 2020.04.03 |
BOJ 11054 - 가장 긴 바이토닉 부분 수열 (0) | 2020.04.03 |
BOJ 1992 - 쿼드트리 문제풀이 (0) | 2020.04.03 |
댓글
이 글 공유하기
다른 글
-
BOJ 7576 - 토마토 문제풀이
BOJ 7576 - 토마토 문제풀이
2020.04.05 -
BOJ 9663 - N-Queen 문제풀이
BOJ 9663 - N-Queen 문제풀이
2020.04.03 -
BOJ 15649 - N과 M (1) 문제풀이
BOJ 15649 - N과 M (1) 문제풀이
2020.04.03 -
BOJ 11054 - 가장 긴 바이토닉 부분 수열
BOJ 11054 - 가장 긴 바이토닉 부분 수열
2020.04.03