반응형
https://www.acmicpc.net/problem/1298
1298번: 노트북의 주인을 찾아서
어느 날 모든 학생들은 한 명이 한개의 노트북을 가지고 공부하던 도중, 자리를 바꾸다가 그만 노트북이 뒤섞이고 말았다. 대다수의 학생들은 자신의 노트북을 잘 알고 있어서 자신의 노트북을
www.acmicpc.net
해결 방법 : DFS 응용
- person ~ [1, N]에게 순차적으로 노트북을 배정한다.
- 만약 A가 점유하려는 노트북이 이미 배정되어 있다면, 해당 노트북을 받은 사람(owned[notebook])이 노트북을 양보 할 수 있는지를 DFS로 탐색한다.
- 고려해야 할 점은, person1이 [1,2,3], person2가 [1,2], person3가 [1]을 원한다고 할 때, person3의 순서에서 person1은 notebook2를, person2는 notebook1을 가지고 있을 것이다. 이런 경우에 person1과 person2가 서로를 무한히 호출할 수 있다.
- 각 순서(time)에 personX가 이미 호출되었는지를 판단하는 배열 visited를 사용하여, personX가 호출되면 해당 time을 viseted[X]에 갱신, 이후 visted[X]가 time이면 return해주었다.
import sys
input = sys.stdin.readline
from collections import defaultdict
def solution(N, G):
owned = [0] * (N + 1) # index = notebook, value = person
visited = [0] * (N + 1) # visted[x] = t means, person X가 t번째에 이미 호출되었음.
def dfs(per, time):
if visited[per] == time: return False # 이미 탐색
visited[per] = time # time번째에 per 탐색
for note in G[per]:
if owned[note] == per: continue
if owned[note] == 0 or dfs(owned[note], time): # notebook 배정 가능 or 양보 가능
owned[note] = per
return True
return False # 원하는 노트북 배정 불가능
answer = sum([dfs(p, p) for p in range(1, N + 1)]) # 원하는 노트북을 배정 받은 사람 수
return answer
if __name__ == '__main__':
N, M = map(int, input().split())
G = defaultdict(list)
for _ in range(M):
per, note = map(int, input().split())
G[per].append(note)
result = solution(N, G)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 1306 : 달려라 홍준 (0) | 2021.07.30 |
---|---|
백준 1214 : 쿨한 물건 구매 (2) | 2021.07.27 |
백준 1854 : K번째 최단경로 찾기 (0) | 2021.07.25 |
백준 1305 : 광고 (0) | 2021.07.24 |
백준 1071 : 소트 (0) | 2021.07.23 |