🖥️ CS/Baekjoon Algorithms

#15661번 링크와 스타트 (C++)

한국의 메타몽 2021. 2. 15. 00:41

문제 링크 : www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100

www.acmicpc.net

문제 풀이는 다음과 같다.

(1) 전형적인 DFS문제로, A팀과 B팀으로 나뉘는 조합을 DFS로 구한다.

(1)-(2) 즉, bool문을 만들어 1번과 2번이 같은 팀이면 두 번호를 true로, 3번과 4번이 같은 팀이면 자동적으로 남은 사람들은 false로 구성해준다. 

(2) 그렇게 true끼리 묶인 사람끼리의 합과 false끼리 묶인 사람들의 합의 절대값의 차이를 구해서 작은값과 비교해 저장해 나간다.

 

#include <iostream>
#include <climits>
#include <cmath>
using namespace std;

int n = 0, arr[21][21] = {0,}, ans = INT_MAX;
bool ch[21] = {false,};

void dfs(int st){
    if(st>=n){
        int st = 0, lin = 0;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                if(ch[i]&&ch[j]) st+=arr[i][j];
                else if(!ch[i]&&!ch[j]) lin+=arr[i][j];
            }
        }
        if(ans>abs(st-lin)) ans = abs(st-lin);
    }
    for(int i=st; i<=n; i++){
        if(!ch[i]){
            ch[i] = true;
            dfs(i);
            ch[i] = false;
        }
    }
}

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin >> arr[i][j];
        }
    }
    dfs(1);
    cout << ans << "\n";
    return 0;
}

예전에 백준 세컨드 아이디로 풀어본 적이 있었던 문제였다.

시간도 훨씬 단축되는 방식으로 풀었지만, 스스로 온전히 터득한게 아닌 남의 해설을 보고 거의 외운거나 다름이 없는 답안이었다.

만약 실전에서 나온다면 그 긴장되는 상황속에서 '내 머리에서 순수하게 나온 아이디어'로 최단시간에 풀어서 남에게 해설할 수 있는 답을 내놓아 보자, 라는 마음으로 다시 한번 풀어보았다.

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#17427번 약수의 합2 (C++)  (0) 2021.02.24
#4375번 1 (C++)  (0) 2021.02.23
#17836번 공주님을 구해라! (C++)  (0) 2021.02.14
#11000번 강의실 배정 (C++)  (0) 2021.02.13
#20208번 진우의 민트초코우유 (C++)  (0) 2021.02.09