시간초과가 발생했다.
그 이유는 이중포문떄문일까...? 아직 잘 모르겠다.
import sys
numtest =int(sys.stdin.readline())
count =0
for i in range(numtest):
numstu = int(sys.stdin.readline())
check = [False]*numstu
stu_sel =list(map(int,sys.stdin.readline().split()))
for j in range(numstu): # 매칭시 True로 만들기
stack=[j]
if check[stu_sel[j]-1] == False:
while True:
if check[stu_sel[j]-1] == False:
stack.append(stu_sel[j]-1)
j = stu_sel[j]-1
elif check[stu_sel[j]-1] == True:
break
if stack[0] == stack[-1]:
for k in stack:
check[k] =True
break
if len(stack)>numstu:
break
else:
continue
for k in check:
if k == False:
count +=1
print(count)
좋은 코드로 공부
import sys
testcase = int(sys.stdin.readline())
for _ in range(testcase):
n = int(sys.stdin.readline())
choice = [0] + list(map(int, sys.stdin.readline().split()))
visit = [0] * (n+1)
group = 1
for i in range(1, n+1):
if visit[i] == 0:
while visit[i] == 0: #while 두개로 반복
visit[i] = group
i = choice[i]
while visit[i] == group:
visit[i] = -1
i = choice[i]
group += 1
cnt = 0
for v in visit:
if v > 0:
cnt += 1
sys.stdout.write("{}\n".format(cnt))
https://suri78.tistory.com/128
를 참고하였다.
댓글