알고리즘/문제 풀이

6603번: 로또

Themion 2021. 12. 24. 13:56

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

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

k개의 수 중 6개의 수를 kC6번 골라 각각 오름차순으로 출력하는 문제이다. 이 때 입력이 정렬된 상태로 주어지므로 수를 고른 뒤 따로 정렬할 필요 없이 순서대로 출력하면 된다.

#include <cstdio>

#define MIN_K 6
#define MAX_K 12

// len: 로또 번호의 개수, arr: 각 로또 번호
// picks: 로또 번호 후보 중 로또로 예측되는 번호
int len, arr[MAX_K], picks[MIN_K];

// 현재 idx개의 번호를 뽑았으며 마지막으로 뽑은 번호는 last번째 번호이다
void pick(int idx, int last) {
    // 번호를 전부 뽑지 않았다면
    // last 이후 가능한 번호들을 전부 뽑은 뒤 다음 번호를 고른다
    if (idx < MIN_K) for (int i = last + 1; i < len; i++) {
        picks[idx] = arr[i];
        pick(idx + 1, i);
    }
    // 6개의 번호를 모두 뽑았다면 각 번호를 순서대로 출력한뒤 행을 바꾼다
    else for (int i = 0; i < MIN_K; i++) 
        printf("%d%c", picks[i], (i == MIN_K - 1 ? '\n' : ' '));
}

void test_case() {
    // 각 로또 번호를 입력받은 뒤
    for (int i = 0; i < len; i++) scanf("%d", arr + i);
    // 가능한 경우를 모두 출력한 뒤 줄바꿈을 출력해 테스트 케이스의 출력을 종료
    pick(0, -1);
    printf("\n");
}

int main() {
    // 길이가 0이 아닌 모든 테스트 케이스에 대해 가능한 경우를 출력
    while (scanf("%d", &len) && len) test_case();
    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

7569번: 토마토  (0) 2021.12.24
7568번: 덩치  (0) 2021.12.24
6064번: 카잉 달력  (0) 2021.12.24
5696번: 숫자 세기  (0) 2021.12.23
5639번: 이진 검색 트리  (0) 2021.12.23