컴굥일지
[BOJ/백준 15655][C++] N과 M (6) 본문
반응형
문제
https://www.acmicpc.net/problem/15655
문제 내용
입력받은 N개의 자연수 중에 M개를 골라 수열을 만들어 출력하면 된다.
이때 수열을 사전순으로 증가하는 순서대로 출력해야 하며, 수열은 오름차순이어야 한다.
문제 풀이
N과 M (5)과 다르게 N과 M (6)는 수열이 오름차순이어야 한다는 조건이 추가되었다.
N과 M (5)은 몇 개를 선택했는지만 인자로 넘겨서 종료조건을 체크하면 되었지만, N과 M (6)는 오름차순 수열을 만들어야 하기 때문에, 이전에 어떤 값을 선택했었는지에 대한 정보도 넘겨주어야 한다. (값 자체가 아니라, 그 값의 인덱스를 넘겨준다.)
오름차순을 유지하기 위해 이전에 선택한 값의 인덱스를 받아, 그 이후 값부터 for문을 돌기 때문에 used 배열도 필요 없다.
코드
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> result(8, 0);
vector<int> arr;
void back(int cnt, int before_idx) {
if (cnt == m) {
for (int i = 0; i < m; i++) {
cout << result[i] << ' ';
}
cout << '\n';
return;
}
for (int i = before_idx + 1; i < n; i++) {
result[cnt] = arr[i];
back(cnt + 1, i);
}
}
int main() {
cin >> n >> m;
arr.assign(n, 0); // 여기서 초기화를 크기 n만큼 초기화를 할 것
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
back(0, -1);
}
문제 코드 설명
back() 함수에서 넘겨받은 before_idx에 +1을 해서 사용하기 때문에, main에서 넘겨줄 때 -1로 넘겨줘야 한다. (그래야 arr[0] 값을 사용할 수 있다.)
반응형
'알고리즘 > 코테 문제' 카테고리의 다른 글
[BOJ/백준 15657][C++] N과 M (8) (0) | 2023.07.16 |
---|---|
[BOJ/백준 15656][C++] N과 M (7) (0) | 2023.07.16 |
[BOJ/백준 15654][C++] N과 M (5) (0) | 2023.07.16 |
[BOJ/백준 15652][C++] N과 M (4) (0) | 2023.07.16 |
[BOJ/백준 15651][C++] N과 M (3) (0) | 2023.07.16 |
Comments