백준

백준 15649 C++

solfa 2023. 11. 24. 14:00

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

 

15649번: N과 M (1)

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

www.acmicpc.net

 

정답 코드

#include <iostream>
using namespace std;

int N, M;
int arr[9];
bool visited[9];

void dfs(int k){
    if (k == M){
        for (int i = 0; i < M; i++){
            cout << arr[i]<< ' ';
        }
        cout << '\n'; 
    }
    else{
        for (int i = 0; i < N; i++){
            if (!visited[i]){ // 방문할 노드(인덱스)가 있으면
                visited[i] = true; // 방문 체크해줌
                arr[k] = i+1;
                dfs(k + 1); // 다음 노드(인덱스) 재귀 고고 = 더 깊이 들어간다는 소리
                visited[i] = false; // 초기화 과정 (백트래킹)
            }
        }
    }
}

int main(){
    cin >> N >> M;
    dfs(0);
}

visited 배열은 0부터 시작해도 상관 없는데

arr에 저장할 땐 +1을 해줘서

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

1부터라는 조건을 만족시킨다!

 

 

 

ex) arr[k] = i;만 하면 출력이 0부터 됨

 

+아니면 그냥 반복문을 1부터 시작해도 됨! 취향 차이~

 

cout << '\n';

 

endl 쓰면 시간초과 나더라! 개행문자를 쓰자

 

728x90

'백준' 카테고리의 다른 글

백준 10819 C++  (1) 2023.11.27
백준 1182 C++  (1) 2023.11.26
백준 9663 C++  (1) 2023.11.23
백준 2231 C++  (2) 2023.11.22
백준 7568 C++  (2) 2023.11.22