[C++] 백준 6603 : 로또

Kim Nahyeong·2022년 3월 11일
0

백준

목록 보기
98/157

#include <iostream>
#include <vector>
using namespace std;

int k;
int S[13]; // 6 < k < 13
int lotto[6] = {0};
void dfs(int start, int x){ // start : 함수 시작점 x : 로또 몇번째?
  if(x == 6){ // 로또가 마지막까지 채워지면
    for(int i = 0; i < 6; i++){
      printf("%d ", lotto[i]);
    }
    printf("\n");
    return; // 재귀 종료
  } else {
    for(int i = start; i < k; i++){
      lotto[x] = S[i]; //집합 값 하나씩 lotto에 넣기
      dfs(i+1, x+1); // 넣은 것 다음값 부터 다음 로또값에 집어넣기
    }
  }
}

int main(int argc, char** argv){
  do{ // 0 입력시 종료
    scanf("%d", &k);
    for(int i = 0; i < k; i++){
      scanf("%d", &S[i]);
    }

    dfs(0, 0);
    printf("\n");
  } while(k);

  return 0;
}

백트래킹 dfs 연습용 문제. 재귀를 이용해서 풀었다.
다시 수련이 필요하다... 알 듯 말 듯 하면서 모르겠는 백트래킹.
그래도 잘 생각만 하면 코드가 짧아서 좋다.

dfs 함수 만들고, 종료 조건 제시하고, 종료 조건 아닌 경우에는 for문을 만들어서 모든 경우에 대해(브루트포스 알고리즘) 순회하면서 재귀함수를 돌려주면 된다.

0개의 댓글