일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재귀
- 소수
- 위상정렬
- BFS
- 너비우선탐색
- binary search
- 알고리즘
- 비트연산
- 딕셔너리
- recursion
- 에라토스테네스
- 비트마스킹
- 외적
- Bitmasking
- 큐
- Algorithm
- CCW알고리즘
- DP
- CCW 알고리즘
- 투 포인터
- ccw
- BOJ
- 다익스트라
- 이진 탐색
- 백준
- Two Pointers
- dijkstra algorithm
- deque
- Python
- 에라토스테네스의 체
- Today
- Total
꾸꾸리
[BOJ/Python] 5021_왕위 계승 본문
문제 출처:https://www.acmicpc.net/problem/5021
5021번: 왕위 계승
유토피아의 왕이 사망했다. 왕은 자손을 남기지 않고 사망했기 때문에, 왕위를 계승할 사람을 지목하지 않았다. 왕실 귀족은 왕위를 주장하기 시작했다. 유토피아의 법에는 왕의 계승자가 없는
www.acmicpc.net
문제
유토피아의 왕이 사망했다. 왕은 자손을 남기지 않고 사망했기 때문에, 왕위를 계승할 사람을 지목하지 않았다. 왕실 귀족은 왕위를 주장하기 시작했다. 유토피아의 법에는 왕의 계승자가 없는 경우에, 나라를 세운 사람과 혈통이 가까운 사람이 유토피아를 통치한다는 조항이 있다.
나라를 세운 사람과 혈통이 가장 가까운 사람은 그의 자손이 아닌 사람과 피가 덜 섞인 사람이다. 모든 사람은 아버지의 혈통과 어머니의 혈통을 반 씩 받게 된다. 나라를 세운 사람의 자식은 1/2 왕족이며, 그 아들이 왕족이 아닌 사람과 결혼한 경우에는 아들의 자식은 1/4 왕족이 된다.
가장 나라를 세운 사람과 혈통이 가까운 사람을 찾는 프로그램을 작성하시오.
입력
첫째 줄에 N과 M이 주어진다. (2 ≤ N, M ≤ 50)
둘째 줄에 유토피아를 세운 사람의 이름이 주어진다.
다음 N개 줄에는 가족 정보가 주어진다. 정보는 이름 세 개로 이루어져 있고, 공백으로 구분되어져 있다. 첫 번째 이름은 자식의 이름이고, 뒤의 두 이름은 부모의 이름이다.
다음 M개 줄에는 왕위를 계승받기를 주장하는 사람의 이름이 한 줄에 하나씩 주어진다.
모든 이름은 1~10글자이며, 알파벳 소문자로만 이루어져 있다. 나라를 세운 사람이 왕위를 계승하는 경우나, 누군가의 자식인 경우는 없다.
출력
첫째 줄에 유토피아를 세운 사람과 가장 혈통이 가까운 사람의 이름을 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.
문제에 주어지는 가족 관계는 성별, 나이를 고려하지 않고 만들었기 때문에, 실제로는 말이 안되는 경우가 나올 수도 있다. 하지만, 모든 자식의 부모는 유일하며, 다시 자식이 부모의 부모가 되는 경우도 없다. 또, 한 사람이 여러 명의 자식이 될 수 도 없다.
예제 입력 1
9 2
edwardi
charlesi edwardi diana
philip charlesi mistress
wilhelm mary philip
matthew wilhelm helen
edwardii charlesi laura
alice laura charlesi
helen alice bernard
henrii edwardii roxane
charlesii elizabeth henrii
charlesii
matthew
예제 출력 1
matthew
예제 입력 2
4 5
andrew
betsy andrew flora
carol andrew betsy
dora andrew carol
elena andrew dora
carol
dora
elena
flora
gloria
예제 출력 2
elena
풀이
- 유토피아를 세운 사람과 혈통이 가장 가까운 사람이 다음 왕이 된다.
- 왕의 후보들 중에서 가장 혈통이 가까운 사람을 찾아 출력하는 문제이다.
코드는 다음과 같다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import sys
import collections
n,m = map(int,sys.stdin.readline().split())
king = sys.stdin.readline().rstrip()
graph = collections.defaultdict(list)
value = dict()
has_parent = dict()
for _ in range(n):
a,b,c = sys.stdin.readline().split()
graph[b].append(a)
graph[c].append(a)
has_parent[a] = True
if b not in has_parent:
has_parent[b] = False
if c not in has_parent:
has_parent[c] = False
queue = collections.deque()
for name,bool in has_parent.items():
if bool == False:
value[name] = 0
queue.append(name)
value[king] = 1
while queue:
name = queue.popleft()
for next in graph[name]:
if next in value:
value[next]+= value[name]/2
queue.append(next)
else:
value[next] = value[name]/2
max_value = -1
result_name = ''
for _ in range(m):
d = sys.stdin.readline().rstrip()
if d not in graph:
continue
if value[d] > max_value:
max_value = value[d]
result_name = d
print(result_name)
|
cs |
- 우선 유토피아를 세운 사람의 이름을 king이라는 변수에 저장한다.
- 자식 a에 대하여, 부모 b,c에 대한 graph를 만든다.
- 주어진 조건에서 부모가 존재하지 않는 사람들을 큐에 넣어준다. 또한 이 사람들의 value를 0으로 초기화한다. 여기서 value는 혈통과 가까운 정도를 나타내며, 1에 가까울수록 혈통에 가까움을 의미한다.
- 유토피아를 세운 사람의 value는 1로 설정한다.
- 이후에 큐에 원소가 존재하는 동안 자식들의 vlaue를 구한다.
- 자식 a에 대하여 부모는 b,c 총 두 명이므로, 자식의 value는 두 명에게서 각각 반씩 받는다.
- b의 경우, 자식 a에게 자신의 value의 절반을 준다. 여기서 value [a] = vlaue [b]/2로 생성한다.
- 이제 c가 a에게 자신의 value의 절반을 준다.
- 그런데 a의 value가 이미 존재하므로, value[a] += vlaue [c]/2를 통해 c의 value의 절반을 더해주고, 더 이상 부모가 없으므로 큐에 a를 넣어준다.
- 최종적으로 사람들의 value가 정해졌으므로, 왕의 후보자들 중 value가 가장 높은 사람을 출력한다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ/Python] 17396_백도어 (1) | 2023.04.08 |
---|---|
[BOJ/Python] 25587_배수로 (0) | 2023.04.04 |
[BOJ/Python] 14431_소수마을 (0) | 2023.04.03 |
[BOJ/Python] 25187_고인물이 싫어요 (0) | 2023.04.02 |
[BOJ/Python] 9694_무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (0) | 2023.03.31 |