Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @Builder
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
Archives
- Today
- Total
기록
백준_9466_텀 프로젝트 본문
문제
풀이
1) 사이클 찾기
모든 학생들을 시작점으로 두고 dfs를 통해 사이클을 탐색한다.
1. 기존에 방문하지 않은 학생이라면,
- 방문기록을 남긴다.
- 다음 학생으로 이동한다.
2. 기존에 방문한 학생이라면, 방문 경로를 찾아 사이클을 이루는 학생의 수를 반환한다.
2) 시간초과
시간초과로 오래 고민했던 문제인데, 다른 문제를 풀면서 다시 한번 도전했다.
코드
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
def dfs(n) :
if n == END :
cnt = 0
n = visited.pop()
for pre in visited[::-1] :
cnt += 1
if pre == n : return cnt
return False
nxt, student[n] = student[n], END # visited
visited.append(n)
return dfs(nxt)
END = 0
visited = list()
for t in range(int(input().strip())) :
N = int(input().strip())
student = list(map(int, input().strip().split()))
student = [END] + student
cnt = 0
for i in range(N) :
visited.clear()
cnt += dfs(i+1)
print(len(student) - cnt - 1)
마무리
사이클을 찾는 문제로, 아래의 문제와 유사한 풀이를 사용했다.
'코딩테스트 > python' 카테고리의 다른 글
백준_1509_팰린드롬 분할 (0) | 2022.10.10 |
---|---|
백준_1647_도시 분할 계획 (0) | 2022.10.06 |
백준_16724_피리 부는 사나이 (0) | 2022.10.04 |
백준_16946_벽 부수고 이동하기4 (0) | 2022.10.03 |
백준_14391_종이조각 (0) | 2022.05.10 |
Comments