피너클의 it공부방
백준 15657 N과 M(8) (c++) : 피너클 본문
728x90
반응형
https://www.acmicpc.net/problem/15657
15657번: N과 M (8)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
간단한 구현문제다.
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n);
값을 입력받고 정렬한다.
vector<int> v;
solve(0, 0, v);
그후 비어있는 벡터 v를 선언한뒤 solve에 넣어준다.
void solve(int idx, int num, vector<int> v) {
if (num == m) {
for (int i = 0; i < num; i++) cout << v[i] << ' ';
cout << '\n';
return;
}
solve함수는 (현재 배열 위치, v에 넣은 숫자 수, 벡터 v)를 전달받는다.
만약 num과 m이 같다면 v값들을 전부 출력하고 바로 함수를 종료한다.
if (idx == n - 1) {
for (int i = 0; i < num; i++) cout << v[i] << ' ';
for (int i = 0; i < m - num; i++)cout << arr[idx] << ' ';
cout << '\n';
return;
}
만약 num==m이 아닌데 idx가 끝까지 왔다면
일단 v값들을 전부 출력한뒤 m - num만큼 arr[idx]값을 출력하고 바로 함수를 종료한다.
for (int i = idx; i < n; i++) {
v.push_back(arr[i]);
solve(i, num + 1, v);
v.pop_back();
}
return;
}
숫자가 겹쳐도 되니 idx부터 시작해 n까지의 반복문을 만든뒤
v에 arr[i]값을 넣고 solve를 실행한뒤 v에서 arr[i]값을 뺸다.
위의 과정을 반복하면 된다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, m;
int arr[9];
void solve(int idx, int num, vector<int> v) {
if (num == m) {
for (int i = 0; i < num; i++) cout << v[i] << ' ';
cout << '\n';
return;
}
if (idx == n - 1) {
for (int i = 0; i < num; i++) cout << v[i] << ' ';
for (int i = 0; i < m - num; i++)cout << arr[idx] << ' ';
cout << '\n';
return;
}
for (int i = idx; i < n; i++) {
v.push_back(arr[i]);
solve(i, num + 1, v);
v.pop_back();
}
return;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n);
vector<int> v;
solve(0, 0, v);
}
전체코드다.
728x90
반응형
'백준' 카테고리의 다른 글
백준 14938 서강그라운드 (c++) : 피너클 (0) | 2022.07.29 |
---|---|
백준 11779 최소비용 구하기 2 (c++) : 피너클 (0) | 2022.07.29 |
백준 4999 아! (c++) : 피너클 (0) | 2022.07.23 |
백준 9086 문자열 (c++) : 피너클 (0) | 2022.07.22 |
백준 2754 학점계산 (c++) : 피너클 (0) | 2022.07.21 |
Comments