- 문제 : https://www.acmicpc.net/problem/9466
일단 하나의 팀이 만들어지려면 하나의 싸이클이 만들어져야하는데, 이는 탐색을 돌다가 마지막 사람이 선택한 사람이 첫번째 사람일 때 팀이 완성된다고 이해했다. 결과적으로 정답과 로직은 맞지만 틀린 부분이 많다.
탐색을 돌다가 다음 사람이 리스트에 있을 때, 다음 사람까지 리스트에 추가한다.
만약 마지막 사람과 첫번째 사람이 같다면 싸이클이 만들어진 것이므로 전체 길이-1을 한 값을 n에서 빼준다
그런데 여기에 문제가 있다
visit처리를 하지 않아서 같은 팀이 중복으로 생길 수 있다 -> 틀린 답을 출력
그래서 나름 고쳐본다고 했는데, 잘 안돼서 전에 풀었던 풀이를 봤다.
그러니까 result는 팀을 만든 모든 사람들이 있고, 각각의 팀은 cycle 리스트에 삽입한 후 진행한다
- 정답 풀이 :
import sys
sys.setrecursionlimit(10**7)
input=sys.stdin.readline
#[4,7,6]이 중복되게 세면 안되니까 visit 사용
#싸이클이 되는 경우는 방문한 숫자 중에 cycle에 있는 경우
def dfs(x):
global result
visit[x]=1
cycle.append(x)
if visit[data[x]]:
if data[x] in cycle:
result+=cycle[cycle.index(data[x]):]
else:
dfs(data[x])
for _ in range(int(input())):
n=int(input())
data=list(map(int,input().split()))
data=[0]+data
visit=[1]+[0]*(n)
result=[]
for i in range(1,n+1):
if not visit[i]:
cycle=[]
dfs(i)
print(n-len(result))
-시도해본 풀이
def dfs(x):
global result
result.append(x)
if data[x] in result:
result.append(data[x])
else:
dfs(data[x])
for _ in range(int(input())):
n=int(input())
data=list(map(int,input().split()))
data=[0]+data
count=n
for i in range(1,n+1):
result=[]
dfs(i)
if result[0]==result[-1]:
count-=(len(result)-1)
else:
continue
print(count)
'백준 > Search' 카테고리의 다른 글
[bfs/백준] 1926번 : 그림 (0) | 2022.08.03 |
---|---|
[dfs/백준] 1068번 : 트리 (0) | 2022.07.31 |
[dfs/백준] 2210번 : 숫자판 점프 (0) | 2022.07.30 |
[bfs/백준] 1167번 : 트리의 지름 (0) | 2022.07.30 |
[bfs/백준] 1967번 : 트리의 지름 (0) | 2022.07.30 |