넘치게 채우기

[BOJ] 15652: N과 M(4) 본문

PS/BOJ

[BOJ] 15652: N과 M(4)

riveroverflow 2024. 10. 23. 09:49
728x90
반응형

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

BOJ - N과 M(4)

문제 유형: 백트래킹, dfs, 재귀

문제 난이도: Silver III

시간 제한: 1초

메모리 제한: 512MB

 

문제

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

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

 

입력

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

 

출력

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

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

 

풀이

재귀 함수 solve(int idx, vector<int> &seq)를 다음과 같이 동작시킨다:

만약 seq의 크기가 m이라면, 출력하고 재귀를 탈출한다.

idx가 n보다 크다면, 재귀를 탈출한다.

 

둘 다 아니라면, 더 요소를 추가해야 한다. idx부터 n까지 

 seq에 요소를 하나 추가하고 solve를 호출한 뒤, 다시 seq에서 빼주면 된다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

int n, m;

void solve(int idx, vector<int> &seq) {
  if (seq.size() == m) {
    for (const auto &element : seq) {
      cout << element << " ";
    }
    cout << "\n";
    return;
  }
  if (idx > n)
    return;
  for (int i = idx; i <= n; ++i) {
    seq.emplace_back(i);
    solve(i, seq);
    seq.pop_back();
  }
}

int main(int argc, char *argv[]) {
  cin >> n >> m;
  vector<int> seq;
  solve(1, seq);

  return 0;
}
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 15663 - N과 M(9)  (0) 2024.10.25
[BOJ] 15654 - N과 M(5)  (0) 2024.10.24
[BOJ] 11725 - 트리의 부모 찾기  (0) 2024.10.22
[BOJ] 11053: 가장 긴 증가하는 부분 수열  (0) 2024.10.21
[BOJ] N과 M(2)  (0) 2024.10.20