🖥️ CS/Baekjoon Algorithms

#9446번 텀 프로젝트 (C++)

한국의 메타몽 2020. 9. 25. 15:03

링크 : www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

이 문제의 풀이는 #2668번 숫자고르기 (C++)와 동일하며(링크 참조), 

숫자고르기를 이해하면 텀 프로젝트 문제또한 일사천리로 해결이 가능하다.

 

다만 유의해야할 점은 다음과 같다. 

 

(1) 학생의 최대수는 100,000명이므로, 메모리 관리에 신경을 써야한다. 

(2) 테스트 케이스만큼 반복적으로 실행된다. 즉, 같은 함수 + 변수를 공유해야 메모리 관리가 가능하다.

(3) 팀플이 가능한 학생이 아니라 불가능한 학생수를 출력하는 것이다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int test = 0, ans = 0;
vector<int> s;
bool check[100001];
bool fin[1000001];

void dfs(int i) {
    check[i] = true;
    if (!check[s[i]]) {
        dfs(s[i]);
    }
    else if (!fin[s[i]]) {
        ans++;
        for (int j = s[i]; j != i; j = s[j]) ans++;
    }
    fin[i] = true;
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int cnt = 0, temp = 0, num = 0;
    cin >> test;
    while (cnt < test) {
        cin >> num;
        s.push_back(0);
        for (int i = 1; i <= num; i++) {
            cin >> temp;
            s.push_back(temp);
        }
        for (int i = 1; i <= num; i++) {
            if (!check[i]) {
                dfs(i);
            }
        }
        cout << num-ans << "\n";
        ans = 0;
        memset(check, false, sizeof(check));
        memset(fin, false, sizeof(fin));
        s.clear();
        cnt++;
    }

    return 0;
}

memset을 통한 초기화를 잊지말아야한다. 

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

#7576번 토마토 (C++)  (0) 2020.09.29
#2458번 키 순서 (C++)  (0) 2020.09.28
#2668번 숫자고르기 (C++)  (0) 2020.09.24
#14716번 현수막 (C++)  (0) 2020.09.24
#10026번 적록색약 (C++)  (0) 2020.09.21