[Python] BOJ 14676 - 영우는 사기꾼?
14676번: 영우는 사기꾼?
프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 건물 종류의 개수 N, 건물 사이 관계의 개수 M, 영우의 게임 정보의 개수 K가 주어진다.(1 ≤ N, M, K ≤ 100,000) 다음 줄부터 M줄에 걸쳐
www.acmicpc.net
앞서 올렸던 위상정렬 알고리즘을 응용해서 푸는 문제이다.
1. M만큼 X, Y를 입력받고 graph[X]에 Y를 append해주고, indegree[Y]에 1을 더해준다.
2. K만큼 반복문을 돌며 건물을 짓거나 파괴합니다.
3. 만약 command가 1이라면 building번 건물을 짓고자 하는 것이므로 indegree[building]을 확인한다.
3-1. indegree[building]이 1이상이면 선행조건(먼저 지어야 하는 건물)이 아직 지어지지 않은 것이므로 Lier!를 출력.
3-2. indegree[building]이 0이하이면 build[building]을 1증가시킨다. (build배열: building번 건물을 지은 횟수)
-> building번 건물이 처음 지어진 것이면 building번 건물과 연관된 건물들의 indegree를 1줄여준다.
4. command가 2라면 building번 건물을 파괴하고자 하는 것이므로 build[building]을 확인한다.
4-1. build[building]이 0 이하이면 파괴할 수 없으므로 Lier! 출력.
4-2. build[building]이 1이상이면 build[building]을 1감소시킨다.
-> 만약 build[building]이 0이 되면 다시 지을 때 선행조건을 검사해줘야하므로 building번 건물과 연관된
건물들의 indegree를 1증가시킨다.
5. 마지막까지 sys.exit(0)에 안 걸리고 돌아가면 "King-God-Emperor" 출력
import sys input = sys.stdin.readline N, M, K = map(int,input().split()) graph = [[] for _ in range(N+1)] build = [0] * (N+1) indegree = [0] * (N+1) for _ in range(M): X, Y = map(int,input().split()) graph[X].append(Y) indegree[Y] += 1 for _ in range(K): command, building = map(int,input().split()) if command == 1: if indegree[building]: print("Lier!") sys.exit(0) build[building] += 1 if build[building] == 1: for i in graph[building]: indegree[i] -= 1 else: if build[building] <= 0: print("Lier!") sys.exit(0) build[building] -= 1 if not build[building]: for i in graph[building]: indegree[i] += 1 print("King-God-Emperor")
(solved.ac 티어: 골드 4)