PS

[λ°±μ€€] 2458 ν‚€ μˆœμ„œ with Python (Feat. PyPy3)

ν˜•μ€€_It's 2021. 9. 2. 22:44
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 2458 ν‚€ μˆœμ„œ

πŸ’‘ 쑰건 및 풀이

  1. 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ λΆ™μ—¬μ Έ μžˆλŠ” 학생듀끼리 두 λͺ…μ”© ν‚€λ₯Ό λΉ„κ΅ν–ˆλ‹€.
  2. Nλͺ…μ˜ 학생듀은 λͺ¨λ‘ ν‚€κ°€ λ‹€λ₯΄λ‹€.
  3. ν”Œλ‘œμ΄λ“œμ™€μƒ¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 해결이 κ°€λŠ₯ν•œ λ¬Έμ œμ΄λ‹€.
  4. 2 <= N <= 500, 0 <= M <= N(N-1)/2
  5. M개의 쀄에 두 ν•™μƒμ˜ ν‚€λ₯Ό λΉ„κ΅ν•œ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ–‘μ˜ μ •μˆ˜ a, bκ°€ μ£Όμ–΄μ§„λ‹€.
  6. a, b == aκ°€ b보닀 μž‘λ‹€
  7. μžμ‹ μ˜ ν‚€κ°€ λͺ‡λ²ˆμ§ΈμΈμ§€ μ•Œ 수 μžˆλŠ” ν•™μƒμ˜ 수λ₯Ό κ΅¬ν•˜λŠ” 문제

πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

from sys import stdin

n, m = map(int, stdin.readline().split())
inf = int(1e9)
graph = [[inf] * (n + 1) for _ in range(n + 1)]

for _ in range(m):
    a, b = map(int, stdin.readline().split())
    graph[b][a] = 1

for i in range(1, n + 1):
    for j in range(1, n + 1):
        for k in range(1, n + 1):
            if j == k:
                graph[j][k] = 0
                continue
            if graph[j][k] > graph[j][i] + graph[i][k]:
                graph[j][k] = graph[j][i] + graph[i][k]


res = n
for i in range(1, n + 1):
    checker = 1
    for j in range(1, n + 1):
        if graph[i][j] == inf and graph[j][i] == inf:
            res -= 1
            checker = 0
        if not checker:
            break

print(res)

πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

예제

6 7
1 3
1 5
3 4
5 4
4 2
4 6
5 2

μ‹€ν–‰κ²°κ³Ό

2

⌨️ 문제 풀이

  1. μ΅œμ†Œ 거리λ₯Ό μ •ν•΄μ€€λ‹€κ³  μƒκ°ν•˜κ³  ν”Œλ‘œμ΄λ“œ 와샬을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 2차원 리슀트λ₯Ό λ§Œλ“€κ³ 
    INF 값을 λ„£μ–΄ 리슀트λ₯Ό μ΄ˆκΈ°ν™”ν–ˆλ‹€.
  2. a, b 값을 μž…λ ₯λ°›κ²Œ 되면 a κ°€ b 보닀 μž‘λ‹€ λΌλŠ” 쑰건에 따라, 2차원 λ¦¬μŠ€νŠΈμ— graph[b].append(a)
  3. ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰
  4. μžμ‹ μ˜ ν‚€κ°€ λͺ‡λ“±μΈμ§€ μ•Œ μˆ˜μžˆλŠ” μ‚¬λžŒμ„ μ²˜μŒλΆ€ν„° Nλͺ…이라고 μ •μ˜ν•œ λ’€ 1번 학생뢀터 순차적으둜
    2쀑 λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•΄ ν”Œλ‘œμ΄λ“œ μ™€μƒ¬λ‘œ λ§Œλ“  2차원 λ¦¬μŠ€νŠΈμ— μ ‘κ·Ό
  5. if graph[i][j] == inf and graph[j][i] == inf:
    i번 학생이 j번 ν•™μƒκ³Όμ˜ μž‘λ‹€, ν¬λ‹€μ˜ 정보가 아무것도 μ—†λ‹€λ©΄ res -= 1
  6. 2쀑 λ°˜λ³΅λ¬Έμ„ λΉ μ Έλ‚˜μ˜€κΈ° μœ„ν•œ checkerλ³€μˆ˜μ— 0을 λ„£μ–΄μ£Όκ³ (False) 반볡문 νƒˆμΆœ
  7. PyPy3 제좜

πŸ’Ύ λŠλ‚€μ 

  • 문제λ₯Ό 보자마자 ν”Œλ‘œμ΄λ“œμ™€μƒ¬ μ•Œκ³ λ¦¬μ¦˜κ³Ό μœ λ‹ˆμ˜¨-νŒŒμΈλ“œκ°€ 생각났닀.
    μœ λ‹ˆμ˜¨-νŒŒμΈλ“œλ‘œ κ΅¬ν˜„μ„ ν•˜λ €λ‹€λ³΄λ‹ˆ μ ˆλŒ€ μ•„λ‹Œ 것 κ°™μ•„ ν”Œλ‘œμ΄λ“œμ™€μƒ¬μ„ μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.
  • μ•„λŠ” λΆ„λ“€μ˜ 이야기λ₯Ό λ“€μ–΄λ³΄λ‹ˆ BFS둜 κ΅¬ν˜„ν•˜μ…¨λ‹€κ³  ν–ˆλ‹€.
  • ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν•΄κ²°ν–ˆμ„ λ•Œ, Python3 둜 μ‹œκ°„μ΄ˆκ³Όκ°€ μƒκ²ΌμœΌλ©°, PyPy3 λŠ” 톡과
  • BFS둜 ν’€μ΄ν•˜λŠ” 방법도 κ΅¬ν˜„ν•΄λ΄μ•Όκ² λ‹€.
  • 문제λ₯Ό ν’€μ‹œκ°„μ€ μ—†λŠ”λ° 생각할 μ‹œκ°„μ΄ λ„ˆλ¬΄ κΈΈλ‹€. 아직 μˆ™λ‹¬μ΄ λ˜μ§€ λͺ»ν•œ 것이라고 μƒκ°ν•˜κ³  더 풀어봐야겠닀.
λ°˜μ‘ν˜•