danbibibi
article thumbnail

문제

문제 바로가기> BOJ 9466번: 텀 프로젝트

 

9466번: 텀 프로젝트

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

www.acmicpc.net

 

풀이

dfs 를 이용하여 팀을 이루는 학생들을 구하고, 이를 전체 학생 수에서 빼주는 방식으로 문제를 풀었다.

N이 최대 100,000이므로, 방문했던 cycle을 재방문하는 것을 피해야한다.

이를 위해 방문을 시작하고 중간에 cycle이 이루어졌더라도 해당 cycle을 구해주기 위해 cnt 배열을 이용해주었다.

#include<iostream>
#include<cstring>
#define MAX 100005
using namespace std;

int N;
int num[MAX];
int cnt[MAX];
int visited[MAX];

void init(){
    memset(cnt, 0, sizeof(cnt));
    memset(visited, 0, sizeof(visited));
}

void input(){
    cin >> N;
    for (int i = 1; i <= N; i++)
        cin >> num[i];
}

int get_team(int n, int t, int d){
    visited[n] = t;
    cnt[n] = d;

    int nxt = num[n];

    // cycle을 이룬 경우
    if(visited[nxt] == t)
        return d - cnt[nxt] + 1;

    // 이전 탐색에서 이미 방문한 경우
    if(visited[nxt])
        return 0;

    return get_team(nxt, t, d + 1);
}

void solve(){
    int ans = N, turn=1;
    for (int n = 1; n <= N; n++){
        if(visited[n]) continue; // 이미 방문한 경우
        ans -= get_team(n, turn++, 1);
    }
    cout << ans << "\n";
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int TC; cin >> TC;
    while(TC--){
        init();
        input();
        solve();
    }
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 2617번: 구슬 찾기  (0) 2024.03.25
BOJ 20040번: 사이클 게임  (1) 2024.03.24
BOJ 3020번: 개똥벌레  (0) 2024.03.20
BOJ 16947번: 서울 지하철 2호선  (1) 2024.03.07
BOJ 5719번: 거의 최단 경로  (0) 2024.02.21
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로