반응형
롯데V3
롯데 우승하는 그날까지 개발...ing
롯데V3
전체 방문자
오늘
어제
  • 분류 전체보기 (216)
    • Computer Science (0)
      • 운영체제 (0)
    • Problem Solving (160)
      • 프로그래머스 (93)
      • 백준 (60)
      • 리트코드 (2)
      • SQL (5)
    • 언어 (8)
      • 파이썬 (8)
    • 취준 (1)
      • 합격후기 (1)
    • 도서 리뷰 (21)
      • IT 도서 리뷰 (20)
      • 기타 도서 리뷰 (1)
    • 논문 리뷰 (1)
    • 회고 (5)
      • TIL (5)
    • 머신러닝 (9)
      • 통계 (3)
      • 전처리 (1)
      • 클러스터링 (3)
    • 딥러닝 (3)
      • 자연어처리 (1)
      • LLM (1)
    • 프로젝트 (5)
    • Util (0)
    • Tool (1)
      • Poetry (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • DP

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
롯데V3

롯데 우승하는 그날까지 개발...ing

Problem Solving/백준

구슬 찾기(2617번) - 파이썬(Python)

2022. 5. 26. 07:51
728x90
반응형

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

 

2617번: 구슬 찾기

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

www.acmicpc.net

문제

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

우리에게 주어진 것은 양팔 저울이다. 한 쌍의 구슬을 골라서 양팔 저울의 양쪽에 하나씩 올려 보면 어느 쪽이 무거운가를 알 수 있다. 이렇게 M개의 쌍을 골라서 각각 양팔 저울에 올려서 어느 것이 무거운가를 모두 알아냈다. 이 결과를 이용하여 무게가 중간이 될 가능성이 전혀 없는 구슬들은 먼저 제외한다.

예를 들어, N=5이고, M=4 쌍의 구슬에 대해서 어느 쪽이 무거운가를 알아낸 결과가 아래에 있다.

  1. 구슬 2번이 구슬 1번보다 무겁다.
  2. 구슬 4번이 구슬 3번보다 무겁다.
  3. 구슬 5번이 구슬 1번보다 무겁다.
  4. 구슬 4번이 구슬 2번보다 무겁다.

위와 같이 네 개의 결과만을 알고 있으면, 무게가 중간인 구슬을 정확하게 찾을 수는 없지만, 1번 구슬과 4번 구슬은 무게가 중간인 구슬이 절대 될 수 없다는 것은 확실히 알 수 있다. 1번 구슬보다 무거운 것이 2, 4, 5번 구슬이고, 4번 보다 가벼운 것이 1, 2, 3번이다. 따라서 답은 2개이다.

M 개의 쌍에 대한 결과를 보고 무게가 중간인 구슬이 될 수 없는 구슬의 개수를 구하는 프로그램을 작성하시오.

입력

첫 줄은 구슬의 개수를 나타내는 정수 N(1 ≤ N ≤ 99)과 저울에 올려 본 쌍의 개수 M(1 ≤ M ≤ N(N-1)/2)이 주어진다. 그 다음 M 개의 줄은 각 줄마다 두 개의 구슬 번호가 주어지는데, 앞 번호의 구슬이 뒤 번호의 구슬보다 무겁다는 것을 뜻한다.

출력

첫 줄에 무게가 중간이 절대로 될 수 없는 구슬의 수를 출력 한다.

예제

Example 1:

Input: 
5 4
2 1
4 3
5 1
4 2
Output: 
2

조건

시간 제한 : 1초

메모리 제한 : 128 MB

풀이과정

풀이

간단한 DFS문제. 구슬 각각에 대해 DFS를 적용하면 된다. 아직 모듈화(?)가 익숙치 않아서… 코드가 더러운 게 문제다.

from collections import deque
n, m = map(int, input().split())

# 가벼운 거 / 무거운 거 나눠서 따지기
graph1 = [[] for _ in range(n+1)]
graph2 = [[] for _ in range(n+1)]

for _ in range(m):
    a, b = map(int, input().split())
    graph1[a].append(b)
    graph2[b].append(a)

ans = set()


for k in range(1, n+1):
    q = deque()
    visited = [False]*(n+1)
    q.append((k, 1))
    visited[k] = True
    mark = 0

    while q:
        now, level = q.popleft()
        if mark > n//2:
            ans.add(k)
            break

        for v in graph1[now]:
            if visited[v] == False:
                visited[v] = True
                q.append((v, level+1))
                mark += 1

for k in range(1, n+1):
    q = deque()
    visited = [False]*(n+1)
    q.append((k, 1))
    visited[k] = True
    mark = 0

    while q:
        now, level = q.popleft()
        if mark > n//2:
            ans.add(k)
            break

        for v in graph2[now]:
            if visited[v] == False:
                visited[v] = True
                q.append((v, level+1))
                mark += 1

print(len(ans))
728x90
반응형

'Problem Solving > 백준' 카테고리의 다른 글

육각 보드(12946번) - 파이썬(Python)  (0) 2022.06.04
점프왕 쩰리 (Small)(16173번) - 파이썬(Python)  (0) 2022.06.04
돌 그룹(12886번) - 파이썬(Python)  (0) 2022.06.04
구슬 탈출 2(13460번) - 파이썬(Python)  (0) 2022.05.26
트리(1068번) - 파이썬(Python)  (0) 2022.05.26
    'Problem Solving/백준' 카테고리의 다른 글
    • 점프왕 쩰리 (Small)(16173번) - 파이썬(Python)
    • 돌 그룹(12886번) - 파이썬(Python)
    • 구슬 탈출 2(13460번) - 파이썬(Python)
    • 트리(1068번) - 파이썬(Python)
    롯데V3
    롯데V3

    티스토리툴바