포도가게의 개발일지

python 백준 2617 구슬 찾기 본문

백준

python 백준 2617 구슬 찾기

grape.store 2021. 8. 23. 19:52
반응형

백준 2617번 구슬 찾기

https://www.acmicpc.net/problem/2617

 

2617번: 구슬 찾기

모양은 같으나, 무게가 모두 다른 N개의 구슬이 있다. N은 홀수이며, 구슬에는 번호가 1,2,...,N으로 붙어 있다. 이 구슬 중에서 무게가 전체의 중간인 (무게 순서로 (N+1)/2번째) 구슬을 찾기 위해서

www.acmicpc.net

중점 : 구슬을 무게 순으로 뒀을때 절대 가운데로 올 수 없는 구슬의 개수를 찾는 문제다

접근법

1. 구슬이 5개일때 자신보다 3개이상의 구슬이 본인보다 무겁거나 가볍다면 그 구슬을 절대 가운데에 올 수 없다.

2. bfs나 dfs를 이용하여 본인의 자식노드 or 손자노드가 3개이상이면 절대 중간에 올 수 없다.

3. 구슬을 무거운 순으로 한번 정렬하고 가벼운 순으로 한번 정렬한다

import sys
from collections import deque

sys.stdin = open('inputs.text')


marble, m = map(int,sys.stdin.readline().split())
graph1 = [[] for _ in range(marble+1)]
graph2 = [[] for _ in range(marble+1)]
count = 0
mid_count = marble//2 + 1
for _ in range(m):
    a, b = map(int,sys.stdin.readline().split())
## 인접리스트로 간선의 개수를 무거운 순과 가벼운순으로 2가지로 표현 ##
    graph1[b].append(a)
    graph2[a].append(b)

def bfs1(start):
    global count
    visited = []
    queue = deque([start])
    while queue:
        node = queue.popleft()
        if node not in visited:
            visited.append(node)
            queue.extend(graph1[node])
    if len(visited)>mid_count:
        count += 1
    return visited

def bfs2(start):
    global count
    visited = []
    queue = deque([start])
    while queue:
        node = queue.popleft()
        if node not in visited:
            visited.append(node)
            queue.extend(graph2[node])
    if len(visited)>mid_count:
        count += 1
    return visited
## 가벼운순서와 무거운순서로 bfs를 돌림 ##
for i in range(1,marble+1):
    bfs1(i)
    bfs2(i)
print(count)

'백준' 카테고리의 다른 글

python 백준 2583 영역 구하기  (0) 2021.08.24
python 백준 2623 음악 프로그램  (0) 2021.08.23
python 백준 2573 빙산  (0) 2021.08.23
python 백준 2294 동전2  (0) 2021.08.23
python 백준 2637번 장난감 조립  (0) 2021.08.21
Comments