Computer Science/Algorithm

BOJ 9466: 텀 프로젝트 [Python 3]

무니화니 2023. 1. 5. 00:52

골드 3 난이도의 텀 프로젝트라는 문제를 풀어보았다.

문제를 해석해보자면, 서로서로 프로젝트를 같이 하고 싶은 학생들끼리 그룹을 짜주려고 하는데, 4번이 7번, 7번이 6번 6번이 4번, 즉 서로서로를 꼬리잡기 하듯이 고르면 같은 그룹에 넣어주는 구조이다.

만약 자기 자신을 고르면, 혼자 팀이 된다. (현실 반영...)

내용 자체는 쉽지만 구현하기가 어려웠다.


코드이다.

t=int(input())
for _ in range(t):
    n=int(input())
    data=[0]+list(map(int,input().split()))
    visited=[False for _ in range(n+1)]
    res=0
    for i in range(1,n+1):
        if visited[i]:
            continue
        num=i
        q=[num]
        visited[num]=True
        while True:
            newnum=data[q[-1]]
            if visited[newnum]:
                if newnum in q:
                    visited[newnum]=True
                    res+=(len(q)-q.index(newnum))
                break
            else:
                q.append(newnum)
                visited[newnum]=True
    print(n-res)

먼저, t개의 케이스가 있기 때문에 반복문으로 input을 받고, 누가 어떤 사람을 고를지 데이터를 받았다.

이후, DFS알고리즘을 응용해서 문제를 풀었다.

만약 한 사람이 누구를 고르면, 그 고른 사람이 누구를 골랐는지, 이렇게 돌고 돌리다가 만약 앞서 골랐던 사람이 선택을 당하면, 앞서 골랐던 사람 중 선택을 당한 사람부터 마지막 고른 사람까지 같은 그룹이다.

예시로,

1->2,

2->3,

3->4,

4->2를 골랐다고 해보자.

 

추적 과정은 다음과 같다.

1번은 2번을, 2번을 3번을, 3번은 4번을 추적한다.

이후 4번이 2번을 선택하였기에,

2,3,4번은 res에 넣어주고, 이후 번호부터 다시 search 한다.

 

위 코드에서는 앞 사람이 선택할 때마다, q에 넣고, q 안에 있는 아이가 선택당하면, res에 값을 추가한다.

(res는 그룹에 포함된 총 사람이다.)

 

마지막에 총 사람 중 그룹에 포함 된 사람을 구하면, 정답이다.

(n-res)

 

 

 

'Computer Science > Algorithm' 카테고리의 다른 글

BOJ 1931: 회의실 배정 [Python 3]  (0) 2023.01.05
BOJ 2293: 동전 1 [Python 3]  (0) 2023.01.05
BOJ 1644: 소수의 연속합 [Python 3]  (0) 2022.12.30
BOJ 10951: A+B -4 [Python 3]  (0) 2022.12.30
BOJ 15792: A/B -2 [Python 3]  (0) 2022.12.30