Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

26-LJEDD2 #103

Merged
merged 8 commits into from
Mar 29, 2024
Merged

26-LJEDD2 #103

merged 8 commits into from
Mar 29, 2024

Conversation

LJEDD2
Copy link
Collaborator

@LJEDD2 LJEDD2 commented Mar 16, 2024

πŸ”— 문제 링크

λ°±μ€€ - μ΅œλ‹¨ 경둜 μ°ΎκΈ° | ν”Œλ‘œμ΄λ“œ

문제 μ„€λͺ…

  • n(2 ≀ n ≀ 100)개의 λ„μ‹œμ—μ„œ ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” m(1 ≀ m ≀ 100,000)개의 λ²„μŠ€κ°€ μžˆλ‹€.
  • 각 λ²„μŠ€λŠ” ν•œ 번 μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ λΉ„μš©μ΄ μžˆλ‹€.
  • λͺ¨λ“  λ„μ‹œμ˜ 쌍 (A, B)에 λŒ€ν•΄μ„œ λ„μ‹œ Aμ—μ„œ B둜 κ°€λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ 찾자.

μ œν•œ 쑰건

  • μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” 노선은 ν•˜λ‚˜κ°€ 아닐 수 μžˆλ‹€.
  • iμ—μ„œ j둜 갈 수 μ—†λŠ” κ²½μš°μ—λŠ” κ·Έ μžλ¦¬μ— 0을 좜λ ₯

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

νƒœκ·œμŠ€μŠΉλ‹˜μ˜ κΈ°κ°€λ§‰νžŒ ν”Œλ‘œμ΄λ“œμ›Œμ…œ κ°•μ˜λ₯Ό λ“£κ³  λΈ”λ‘œκ·Έμ— λ”°λ‘œ TIL을 μž‘μ„±ν–ˆλ‹€.

πŸ“ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ(Floyd-Warshall) μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

Note

βœ¨ν•΅μ‹¬ 아이디어
πŸ€” μ§€μ •λœ 좜발 μ§€μ μ—μ„œ λ‹€λ₯Έ μ§€μ μœΌλ‘œ ν–₯ν•˜λŠ” μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜λŠ” λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ‹œμž‘μ§€μ μ΄ μ •ν•΄μ Έμžˆμ§€ μ•Šλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€!
πŸ€” μΆœλ°œμ§€μ μ—μ„œ λͺ¨λ“  λ„μ°©μ§€μ κΉŒμ§€μ˜ λͺ¨λ“  μ΅œμ†ŒλΉ„μš©μ„ κ³„μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€ !
-> ν•œ μ μ—μ„œ 이웃 λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λ©° μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•˜λŠ” λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜κ³ΌλŠ” λ‹€λ₯΄κ²Œ, κ±°μ³κ°€λŠ” 쀑간 λ…Έλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•œλ‹€λŠ” 점!
πŸ€” μ‰½κ²Œ λ§ν•˜μžλ©΄ λΉ„μ‹Ό λˆλ‚΄κ³  νƒμ‹œλ₯Ό νƒˆ 것이냐 1550μ›μœΌλ‘œ λ²„μŠ€ ν™˜μŠΉ λ‘λ²ˆμ„ ν•˜λƒ... μš”λŸ° λŠλ‚Œ !

​
κ΅¬ν˜„ 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

πŸ€” λ™μž‘μ›λ¦¬

1. μ΄ˆκΈ°μ„ΈνŒ…

  • 인접 λ…Έλ“œ λΉ„μš© 2차원 배열을 κ΅¬ν•˜κ³  각 정점 μ‚¬μ΄μ˜ κ°€μ€‘μΉ˜λ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • μ„œλ‘œ μΈμ ‘ν•˜μ§€ μ•Šμ€ λ…Έλ“œκΉŒμ§€μ˜ λΉ„μš©μ€ μ•„μ£Ό 큰 κ°’(INF)으둜 μ„€μ •ν•œλ‹€.
  • 또 자기 μžμ‹ μœΌλ‘œμ˜ λΉ„μš©μ€ 0으둜 ν•œλ‹€.

μž…λ ₯ μ˜ˆμ‹œλ₯Ό 보면 노선이 λ˜‘κ°™μ§€λ§Œ λΉ„μš©μ΄ λ‹€λ₯Έ μž…λ ₯듀이 μ‘΄μž¬ν–ˆλ‹€.

  • 이 뢀뢄에 λŒ€ν•΄ μ΅œμ†Ÿκ°’μœΌλ‘œ μž…λ ₯을 λ„£μ–΄μ£ΌλŠ” 것에 μ£Όμ˜ν•œλ‹€.
import sys
input = sys.stdin.readline

city = int(input()) #λ„μ‹œμ˜ 수
bus = int(input()) #λ²„μŠ€ λ…Έμ„ μ˜ 수

#2차원 ν…Œμ΄λΈ”
INF = int(1e9) #λ¬΄ν•œ
graph = [[INF]*(city+1) for _ in range(city+1)]

#좜발 λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ λ™μΌν•œ 경우 0으둜 μ΄ˆκΈ°ν™”
for x in range(1,city+1) :
    graph[x][x] = 0

# κ°„μ„  정보
for _ in range(bus) :
    # λ²„μŠ€λŠ” μ‚¬μš©ν•  λ•Œ λΉ„μš©μ΄ λ“ λ‹€.
    # μž…λ ₯κ°’ 쀑볡 .. / 더 μ‹Ό λ…Έμ„ μ˜ λΉ„μš©μœΌλ‘œ μž…λ ₯
    start, end, cost = map(int,input().split())
    graph[start][end] = min(cost, graph[start][end])

2. λ™μž‘ 방식

  1. νŠΉμ • λ…Έλ“œ iλ₯Ό μ„ νƒν•œλ‹€.
  2. λ…Έλ“œ iλ₯Ό 쀑간 λ…Έλ“œλ‘œ ν•˜μ—¬ a -> b둜 κ°€λŠ” λΉ„μš©μ„ μ—…λ°μ΄νŠΈ ν•œλ‹€.
  3. 기쑴의 a -> b 둜 κ°€λŠ” λΉ„μš©κ³Ό a -> i + i -> b둜 κ°€λŠ” λΉ„μš©μ„ λΉ„κ΅ν•˜μ—¬ 더 μž‘μ€ κ²ƒμœΌλ‘œ μ—…λ°μ΄νŠΈ ν•œλ‹€. λͺ¨λ“  쑰합을 반볡문으둜 νƒμƒ‰ν•œλ‹€.
  4. 2~3의 과정을 λͺ¨λ“  정점에 λŒ€ν•΄μ„œ λ°˜λ³΅ν•œλ‹€.
    ​

3. κ²½μœ μ μ„ μ§€λ‚˜λŠ” μ΅œλ‹¨κ±°λ¦¬

0번 정점뢀터 k번 μ •μ κΉŒμ§€λ§Œμ„ 경유점으둜 썼을 λ•Œ uμ—μ„œ vκΉŒμ§€ κ°€λŠ” μ΅œλ‹¨ 경둜의 길이λ₯Ό μ°ΎλŠ”λ‹€.

  1. 자료ꡬ쑰 : 2차원 ν…Œμ΄λΈ”

    • λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ˜ μ΅œλ‹¨κ²½λ‘œ ν…Œμ΄λΈ”μ€ 1차원 ν…Œμ΄λΈ”λ‘œ ꡬ성 κ°€λŠ₯ν–ˆμ§€λ§Œ, ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ€ μ‹œμž‘μ μ΄ 1κ°œμ—μ„œ n개둜 μ¦κ°€ν•œλ§ŒνΌ 1차원 ν…Œμ΄λΈ”λ„ n개 μ¦κ°€ν•œ 2μ°¨μ›ν…Œμ΄λΈ”μ΄ ν•„μš”ν•˜λ‹€.
  2. μ•Œκ³ λ¦¬μ¦˜

    • 좜발과 λ„μ°©μ—λŠ” 두 가지 노선이 μžˆλ‹€.
    • 직행노선 : μ§ν–‰λ…Έμ„ μœΌλ‘œ μ΅œλ‹¨κ²½λ‘œ ν…Œμ΄λΈ” κ°±μ‹ ν•˜κΈ°
    • κ²½μœ λ…Έμ„  : κ²½μœ λ…Έμ„ μœΌλ‘œ μ΅œλ‹¨κ²½λ‘œ ν…Œμ΄λΈ” κ°±μ‹ ν•˜κΈ°
  • 직행보닀 였히렀 κ²½μœ λ…Έμ„ μ΄ μ΅œλ‹¨κ²½λ‘œμΌ 수 μžˆλ‹€. κ²½μœ λ…Έμ„ μ΄ κ°€λŠ₯ν•œ λͺ¨λ“  경우λ₯Ό νƒμƒ‰ν•˜μ—¬ μ΅œλ‹¨κ²½λ‘œ ν…Œμ΄λΈ”μ„ κ°±μ‹ ν•΄μ•Ό ν•œλ‹€.
  • κ²½μœ λ…Έμ„  μ™„μ „νƒμƒ‰μ˜ 경우 B > A 값은 B > C > A μΌμˆ˜λ„ B > A μΌμˆ˜λ„ μžˆλ‹€. λ”°λΌμ„œ 두 κ°’ 쀑 μ΅œμ†Œκ°€ λ˜λŠ” 값을 μ΅œλ‹¨κ±°λ¦¬λ‘œ κ°±μ‹ ν•œλ‹€.
  • Aλ₯Ό κ²½μœ ν•˜λŠ” D > C μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν‘œν˜„ν•  수 μžˆλ‹€.
    • D > C μ΅œλ‹¨κ±°λ¦¬ = min ( D > C μ΅œλ‹¨κ±°λ¦¬ν…Œμ΄λΈ” κ°’, ( D > A μ΅œλ‹¨κ±°λ¦¬ν…Œμ΄λΈ” κ°’ + A > C μ΅œλ‹¨κ±°λ¦¬ν…Œμ΄λΈ” κ°’ ) )
  • 경유점, μ‹œμž‘μ , 도착점 3가지 μš”μ†Œμ— 따라 경우의 μˆ˜κ°€ μƒμ„±λ˜λ―€λ‘œ 완전탐색을 κ΅¬ν˜„ν•˜λ €λ©΄ 3쀑for문을 κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.
  • λ”°λΌμ„œ λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³Ό 수 μžˆλ‹€.

βœ… κ΅¬ν˜„ μ½”λ“œ

#ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜
for middle in range(1,city+1) : # 경유점
    for start in range(1,city+1) : # μ‹œμž‘μ 
        for end in range(1,city+1) : # 도착점
            # μ΅œλ‹¨κ²½λ‘œ ν…Œμ΄λΈ”μ—λŠ” λ‹€μ–‘ν•œ 경둜의 값이 λˆ„μ 
            # 직행보닀 였히렀 κ²½μœ λ…Έμ„ μ΄ μ΅œλ‹¨κ²½λ‘œμΌ 수 μžˆλ‹€
            # dpκ°€ μ‚¬μš©λœλ‹€.
            if graph[start][middle] != 1e9 and graph[middle][end] != 1e9:
                cost = graph[start][middle] + graph[middle][end]
                graph[start][end] = min(graph[start][end], cost) # 직행이냐 κ²½μœ λƒ λΉ„κ΅ν•΄μ„œ μ΅œλ‹¨κ²½λ‘œ μ—…λ°μ΄νŠΈ

for x in range(1, city+1):
    for y in range(1, city+1):
        if graph[x][y] == INF:
            print(0, end=' ')
        else:
            print(graph[x][y], end=' ')
    print()

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

[μ•Œκ³ λ¦¬μ¦˜/ κ·Έλž˜ν”„] λ‹€μ΅μŠ€νŠΈλΌ(Dijkstra) vs ν”Œλ‘œμ΄λ“œ 와샬(Floyd Warshall) (JAVA)
ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ(Floyd-Warshall) μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

Comment on lines +29 to +31
if graph[start][middle] != 1e9 and graph[middle][end] != 1e9:
cost = graph[start][middle] + graph[middle][end]
graph[start][end] = min(graph[start][end], cost) # 직행이냐 κ²½μœ λƒ λΉ„κ΅ν•΄μ„œ μ΅œλ‹¨κ²½λ‘œ μ—…λ°μ΄νŠΈ
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ–΄μ°¨ν”Ό minκ°’μœΌλ‘œ 계속 κ°±μ‹ ν•˜κΈ° λ•Œλ¬Έμ—, INFκ°€ μ•„λ‹Œ 경우라고 ꡳ이 쑰건을 걸어쀄 ν•„μš”λŠ” μ—†κ² μ£ ?

graph[start][end] = min(graph[start][end], graph[start][middle] + graph[middle][end])

Copy link
Member

@janghw0126 janghw0126 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ΄λ²ˆμ— μ •μ€λ‹˜ 덕뢄에 μ΄λ¦„λ§Œ λ“€μ—ˆλ˜ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ κ°œλ…μ„ 처음 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ²˜μŒμ—λŠ” 이해가 와닿지 μ•Šμ•˜λŠ”λ°

πŸ€” μ‰½κ²Œ λ§ν•˜μžλ©΄ λΉ„μ‹Ό λˆλ‚΄κ³  νƒμ‹œλ₯Ό νƒˆ 것이냐 1550μ›μœΌλ‘œ λ²„μŠ€ ν™˜μŠΉ λ‘λ²ˆμ„ ν•˜λƒ... μš”λŸ° λŠλ‚Œ !

뢀뢄을 읽고 ν™•μ‹€νžˆ μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€πŸ§ κ°μ‚¬ν•©λ‹ˆλ‹ΉπŸ˜˜

λ˜ν•œ ν”Œλ‘œμ΄λ“œ κ°œλ…μ„ 이해해도 처음 μ ‘ν•΄λ³΄λŠ” 문제라 쉽지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€,, κ·Έλž˜μ„œ λͺ‡ μ‹œκ°„μ„ λΆ™μž‘λ‹€κ°€ 닡이 μ•ˆλ³΄μ—¬μ„œ κ²°κ΅­ μ†μœΌλ‘œ μ½”λ“œλ₯Ό 따라 μž‘μ„±ν•΄λ³΄κ³  μ½”λ“œμ˜ λ™μž‘ 과정을 μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€πŸ₯ΉπŸ₯Ή 아직 이 λΆ€λΆ„ μ•Œκ³ λ¦¬μ¦˜μ„ κ³΅λΆ€ν•˜κΈ°μ—λŠ” λ©€μ—ˆμ§€λ§Œ 곧 λ”°λΌμž‘μ•„μ„œ ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ λΏŒμ…”λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€πŸ‘Š

이번 PR도 μˆ˜κ³ ν•˜μ…¨μ–΄μš”!πŸ”₯


for x in range(1, city+1):
for y in range(1, city+1):
if graph[x][y] == INF:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

29번 μ€„μ—μ„œλŠ” λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄κΈ°μœ„ν•΄ 1e9 λ₯Ό μ‚¬μš©ν•˜μ˜€λŠ”λ° μ—¬κΈ°μ„œλŠ” INF둜 λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚Έ μ΄μœ κ°€ μžˆμ„κΉŒμš”?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ν—‰ μ›λž˜ 1e9둜 써두고 PRμ“Έλ•Œ INF λ³€μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€μ—ˆλŠ”λ° μ½”λ“œ μˆ˜μ •μ΄ 덜 λ˜μ–΄μžˆμ—ˆκ΅°μš” ! λ‹€μŒλ²ˆμ—λŠ” 잘 ... μ²΄ν¬ν•˜κ² μŠ΅λ‹ˆλ‹€ ....

Copy link
Member

@avocado-13 avocado-13 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

였 μ •μ€λ‹˜ 덕뢄에 λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜κ³Ό ν”Œλ‘œμ΄λ“œ μ›Œμ…œ λͺ¨λ‘ μ•Œκ²Œ λ˜μ—ˆμ”λ‹ˆλ‹€ ><
λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜κ³Ό 달리 μ‹œμž‘μ§€μ μ΄ μ •ν•΄μ Έμžˆμ§€ μ•Šκ³ , 쀑간 λ…Έλ“œλ₯Ό κ±°μΉ˜λŠ” κ²½μš°λ„ κ³ λ €ν•œλ‹€λŠ” 점이 ν₯λ―Έλ‘­κ΅°μš” πŸ§πŸ‘€

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants