ANOTHEL RSS 태그 관리 글쓰기 방명록
2021-10-19 00:12:56
728x90
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 8651 7403 6002 85.927%

 

문제

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

  • N개의 자연수 중에서 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

 

입력

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

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

 

출력

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

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

 

입력1 출력1 입력2 출력2 입력3 출력3
3 1
4 5 2
2
4
5
4 2
9 8 7 1
1 7
1 8
1 9
7 8
7 9
8 9
4 4
1231 1232 1233 1234
1231 1232 1233 1234

 

solution

#include <algorithm>
#include <iostream>
#include <vector>

#define MAX 8

static int n(0), m(0), input(0);
static std::vector<int> answer;
static std::vector<int> inputs;
static bool visited[MAX];

void dfs(const int& count, const int& num) {
  if (m == count) {
    for (int i = 0; i < m; i++) std::cout << answer[i] << " ";
    std::cout << "\n";
    return;
  }

  for (int i = num; i < n; i++) {
    answer.push_back(inputs.at(i));
    dfs(count + 1, i + 1);
    answer.pop_back();
  }
  return;
}

int main() {
  std::cout.tie(NULL);
  std::cin.tie(NULL);
  std::ios_base::sync_with_stdio(false);
  std::cin >> n >> m;

  for (int i = 0; i < n; i++) {
    std::cin >> input;
    inputs.push_back(input);
  }
  sort(inputs.begin(), inputs.end());

  dfs(0, 0);

  return 0;
}

 

후기

백트래킹 관련 시리즈의 여섯 번째 문제였다. 사실 이전 문제와 크게 달라진 것이 없고 주어진 숫자의 구조가 조금 변경되었다.

 

(url: https://www.acmicpc.net/problem/15655)

 

태그 : ,
댓글

방문해주신 모든 분들을 환영합니다.

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.

* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.

* 최대한 답변 드리도록 노력하겠습니다.

* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.


guest@이름 ~$
guest@패스워드 ~$
guest@홈페이지주소작성 ~$

guest@댓글작성 ~$




ANOTHEL. Designed by bskyvision.