반응형
    
    
    
  https://www.acmicpc.net/problem/2422
2422번: 한윤정이 이탈리아에 가서 아이스크림을 사먹는데
첫째 줄에 정수 N과 M이 주어진다. N은 아이스크림 종류의 수이고, M은 섞어먹으면 안 되는 조합의 개수이다. 아래 M개의 줄에는 섞어먹으면 안 되는 조합의 번호가 주어진다. 같은 조합은 두 번
www.acmicpc.net
모든 경우의 수를 구하는 brute force문제였습니다.
📕 풀이방법
📔 입력 및 초기화
1. n, m, cnt, 불가한 아이스크림 조합을 그래프 형태로 저장할 vector graph, 뽑은 아이스크림 조합을 저장할 combCk를 선언 후 n, m에 입력받습니다. 2. m만큼 불가한 조합을 a, b를 입력받았을 때 인접리스트 형태로 그래프를 graph에 저장해줍니다.
📔 풀이과정
next_permutation을 이용해 nC3의 모든 조합을 뽑아냅니다. n이 최대 200, 최악은 200C3 = 1313400이므로 시간초과가 나지 않습니다. 뽑아낸 3개의 아이스크림 조합에서 또 2개를 골라 인접리스트 graph에 간선으로 존재하는지 확인해줍니다. 간선으로 존재한다면 해당 아이스크림 조합은 유효하지 않습니다. 2개를 고르는 모든 조합을 확인해 유효한 조합이라면 cnt++해줍니다.
📔 정답출력
cnt를 출력해줍니다.
📕 Code
#include <bits/stdc++.h>
using namespace std;
int n, m, cnt;
vector <int> graph[201], combCk;
bool isValid(int s, int e){
    for(auto next : graph[s]) {
        if(next == e) return false;
    }
    return true;
}
int main(){
    cin >> n >> m;
    for(int i = 0,a,b; i < m; i++) {
        cin >> a >> b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    combCk.resize(n, 1);
    for(int i = 0; i < 3; i++) combCk[i] = 0;
    do{
        int can = 1;
        vector<int> tmp;
        for(int i = 0; i < n; i++) {
            if(!combCk[i]) tmp.push_back(i+1);
        }
        for(int i = 0; i < 3; i++){
            for(int j = i + 1; j < 3; j++){
                if(!isValid(tmp[i], tmp[j])) { can = 0; break; }
            }
        }
        if(can) cnt++;
    }while(next_permutation(combCk.begin(), combCk.end()));
    cout << cnt;
}'Algorithm > Brute Force' 카테고리의 다른 글
| (C++) - 백준(BOJ) 9094 : 수학적 호기심 (0) | 2022.02.13 | 
|---|---|
| (C++) - 백준(BOJ) 1251 : 단어 나누기 (0) | 2022.02.11 | 
| (C++) - 백준(BOJ) 6975 : Deficient, Perfect, and Abundant (0) | 2022.01.05 | 
| (C++) - 백준(BOJ) 6811 : Old Fishin’ Hole (0) | 2022.01.03 | 
| (C++) - 백준(BOJ) 4690 : 완전 세제곱 (0) | 2021.12.06 |