본문 바로가기

Algorithm/BOJ (백준)

[C++] 백준 6603 로또

6603 로또

 

6603번: 로또

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

www.acmicpc.net

(1)  일반적 풀이

C++

//
//  Created by SangWon Kang on 2020/09/04.
//  Copyright © 2020 SangWon Kang. All rights reserved.
//

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pair<int, int>> vpii;
#define INF 987654321
#define endl '\n';
#define FOR(i, n) for(int i=0; i<n; i++)
#define FOR1(i, n) for(int i=1; i<=n; i++)

#define MAX 13
int s[MAX], k;
vi v;

void solve(int num) {
    // 로또의 길이만큼 뽑으면 출력
    if (v.size() == 6) {
        FOR(i, 6) cout << v[i] << ' ';
        cout << endl;
        return;
    }
    for (int i = num; i < k; i++) {
        // 백준 15650 문제와 유사하다.
        v.push_back(s[i]);
        solve(i + 1);
        v.pop_back();
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    while (1) {
        cin >> k;
        if (!k) break;
        FOR(i, k) cin >> s[i];
        solve(0);
        cout << endl;
    }
    return 0;
}

 

백준 15650 문제의 풀이와 유사하다.

-> 15650 풀이

 

[C++] 백준 15650 N과 M (2)

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

kevink1113.tistory.com

 

(2)-1 next_permutation을 이용한 간단한 풀이

C++

//
//  Created by SangWon Kang on 2020/09/04.
//  Copyright © 2020 SangWon Kang. All rights reserved.
//

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pair<int, int>> vpii;
#define INF 987654321
#define endl '\n';
#define FOR(i, n) for(int i=0; i<n; i++)
#define FOR1(i, n) for(int i=1; i<=n; i++)

int k;
vi num(13);

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    while (true) {
        cin >> k;
        if (!k) break;
        FOR(i, k) cin >> num[i];

        // S: 고를 순열 bool형 결정
        vector<bool> S(k, true);
        FOR(i, 6) S[i] = false;

        do {
            FOR(i, k) if (!S[i]) cout << num[i] << " ";
            cout << endl;
        } while (next_permutation(S.begin(), S.end()));
        cout << endl;
    }

    return 0;
}

(2)-2 prev_permutation을 이용한 간단한 풀이

C++

//
//  Created by SangWon Kang on 2020/09/04.
//  Copyright © 2020 SangWon Kang. All rights reserved.
//

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pair<int, int>> vpii;
#define INF 987654321
#define endl '\n';
#define FOR(i, n) for(int i=0; i<n; i++)
#define FOR1(i, n) for(int i=1; i<=n; i++)

int k;
vi num(13);

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    while (1) {
        cin >> k;
        if (!k) break;
        FOR(i, k) cin >> num[i];
        // S: 고를 순열 bool형 결정
        vector<bool> S(k, false);

        FOR(i, 6) S[i] = true;
        do {
            FOR(i, k) if (S[i]) cout << num[i] << ' ';
            cout << endl;
        } while (prev_permutation(S.begin(), S.end()));
        cout << endl;
    }

    return 0;
}

'Algorithm > BOJ (백준)' 카테고리의 다른 글

[C++] 백준 2042 구간 합 구하기  (1) 2024.11.12
[C] 백준 2268 수들의 합 7  (0) 2024.11.06
[C++] 백준 15650 N과 M (2)  (1) 2020.09.04
[C/C++] 백준 11092 Safe Passage  (3) 2020.07.27
[C/C++] 백준 14501 퇴사  (0) 2020.07.27