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

25-janghw0126 #108

Merged
merged 9 commits into from
May 5, 2024
Merged

25-janghw0126 #108

merged 9 commits into from
May 5, 2024

Conversation

janghw0126
Copy link
Member

@janghw0126 janghw0126 commented Mar 26, 2024

πŸ”— 문제 링크

λ°±μ€€ | 녹색 옷 μž…μ€ μ• κ°€ 저닀지?

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

2μ‹œκ°„(κ³ λ―Όν•œ μ‹œκ°„) + 6μ‹œκ°„(λ‹€λ₯Έ 뢄듀이 μ“΄ μ½”λ“œ λœ―μ–΄λ³΄λŠ”λ° κ±Έλ¦° μ‹œκ°„)

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

image
νƒœκ·œλ‹˜μ΄ 이전 PR λ•Œ λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μΆ”μ²œν•΄μ€˜μ„œ ν•œλ²ˆ μ‹œλ„ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€! μƒˆλ‘œ μ ‘ν•œ κ°œλ…μ΄λΌ κ·ΈλŸ°μ§€ 쉽지 μ•Šλ”κ΅°μ—¬,,그치만 더 많이 κ³ λ―Όν•˜κ³  ν’€μ–΄λ³΄λ©΄μ„œ λ‹€μ΅μŠ€νŠΈλΌλ₯Ό λΏŒμ…”λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€πŸ‘ŠπŸ‘Š

Note

λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν•œ λŒ€ν‘œμ μΈ μ΅œλ‹¨ 경둜(μ΅œμ†Œ λΉ„μš©μ΄ λ“œλŠ” 경둜) 탐색 μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.
  • νŠΉμ •ν•œ ν•˜λ‚˜μ˜ μ •μ μ—μ„œ λ‹€λ₯Έ λͺ¨λ“  μ •μ μœΌλ‘œ κ°€λŠ” μ΅œλ‹¨ 경둜λ₯Ό μ•Œλ €μ€€λ‹€.
  • 이 κ³Όμ •μ—μ„œ 도착 정점 뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  λ‹€λ₯Έ μ •μ κΉŒμ§€ μ΅œλ‹¨ 경둜둜 λ°©λ¬Έν•˜μ—¬ 각 μ •μ κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜λ₯Ό λͺ¨λ‘ 찾게 λœλ‹€. 즉, 맀번 μ΅œλ‹¨ 경둜의 정점을 선택해 탐색을 λ°˜λ³΅ν•˜λŠ” 것이닀.

예λ₯Ό λ“€μ–΄λ³΄μž.
image
μœ„μ˜ κ·Έλ¦Όμ—μ„œ 1λΆ€ν„° λ‹€λ₯Έ λͺ¨λ“  λ…Έλ“œλ‘œ κ°€λŠ” μ΅œλ‹¨ 경둜λ₯Ό ꡬ해야 ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž.
image
μ²˜μŒμ—λŠ” λ‹€μŒκ³Ό 같이 1에 인접해 μžˆλŠ” λ…Έλ“œμΈ 2, 3, 4κΉŒμ§€μ˜ μ΅œλ‹¨ 거리 즉, μ΅œμ†Œ λΉ„μš©μ΄ 3, 6, 7μ΄λΌλŠ” 것을 μ•Œ 수 μžˆλ‹€.
image
이후에 λ‹€μŒ λ…Έλ“œμΈ 2λ₯Ό μ²˜λ¦¬ν•˜κ²Œ 되면, 경둜 1 β†’ 3의 λΉ„μš©μ΄ 6인 λ°˜λ©΄μ— 경둜 1 β†’ 2 β†’ 3의 총 λΉ„μš©μ΄ 4λΌλŠ” 것을 μ•Œ 수 μžˆλ‹€. 즉, ν˜„μž¬κΉŒμ§€ μ•Œκ³ μžˆλ˜ 3으둜 κ°€λŠ” μ΅œμ†Œ λΉ„μš©μΈ 6을 μƒˆλ‘œμš΄ λΉ„μš©μΈ 4둜 κ°±μ‹ ν•œλ‹€λŠ” 것이닀.

이λ₯Ό 톡해 λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ€ ν˜„μž¬κΉŒμ§€ μ•Œκ³  있던 μ΅œλ‹¨ 경둜λ₯Ό κ³„μ†ν•΄μ„œ κ°±μ‹ ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

이λ₯Ό λ°”νƒ•μœΌλ‘œ 이번 문제λ₯Ό ν•œλ²ˆ ν’€μ–΄λ³΄μ•˜λ‹€. 아직 λ‚΄ λ¨Έλ¦¬λ‘œλŠ” 슀슀둜 ν’€κΈ°μ—” 역뢀쑱인 것 κ°™μ•„μ„œ λ‹€λ₯Έ λΆ„μ˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•˜μ˜€λ‹€.

πŸ“–BFS + λ‹€μ΅μŠ€νŠΈλΌλ₯Ό μ΄μš©ν•œ 풀이 방법
이 λ¬Έμ œλŠ” BFSκ°œλ…μ„ μ΄μš©ν•΄μ„œ 풀어도 될 것 κ°™μ•„μ„œ ν•œλ²ˆ μ‹œλ„ν•΄λ³΄μ•˜λ‹€. ν•˜μ§€λ§Œ 아직 BFSκ°œλ…μ„ μ™„μ „μ •λ³΅ν•˜μ§€ λͺ»ν•΄μ„œ 생각보닀 μ‹œκ°„μ΄ 많이 걸렸던 것 κ°™λ‹€.

  1. 지도 정보λ₯Ό μ €μž₯ν•  리슀트λ₯Ό μ„ μ–Έν•œλ‹€. μ—¬κΈ°μ„œ μ•ˆμ— μžˆλŠ” 숫자λ₯Ό μ΅œμ†Œλ‘œ λΉ„κ΅ν•˜λ©΄μ„œ λ“€μ–΄κ°ˆ 것이기 λ•Œλ¬Έμ— λ¬΄ν•œμœΌλ‘œ μ„€μ •ν•΄μ€€λ‹€.
  2. 경둜λ₯Ό μ§€λ‚˜κ°ˆ bfs() ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€. 경둜λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ κΊΌλ‚΄κ°€λ©΄μ„œ 큐에 ν˜„μž¬ μœ„μΉ˜λ₯Ό λ„£κ³ , μƒν•˜μ’Œμš°λ‘œ 이동 κ°€λŠ₯ν•œ μœ„μΉ˜λ₯Ό νƒμƒ‰ν•˜λ©΄μ„œ λΉ„μš©μ„ κ°±μ‹ ν•  것이기 λ•Œλ¬Έμ— BFS방식을 κ°€μ Έμ˜¨λ‹€.
  3. queue μ•ˆμ— κ°±μ‹ λœ μœ„μΉ˜λ₯Ό λ„£μ–΄μ£Όκ³  탐색할 μœ„μΉ˜λ₯Ό 순차적으둜 μ €μž₯ν•˜λ©΄μ„œ λ°©λ¬Έ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•œλ‹€.
  4. queue μ•ˆμ΄ 빌 λ•ŒκΉŒμ§€ 즉, λͺ¨λ“  κ°€λŠ₯ν•œ μœ„μΉ˜λ₯Ό 탐색할 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ€€λ‹€.
  5. queue의 μ’…λ£Œ ꡬ문을 μ„€μ •ν•΄μ€€λ‹€.
  6. 각 μœ„μΉ˜λ‘œ 이동할 λ•Œλ§ˆλ‹€ μ΅œμ†Œ λΉ„μš©μ„ κ°±μ‹ ν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ λͺ©μ μ§€κΉŒμ§€μ˜ μ΅œμ†Œ λΉ„μš©μ„ κ³„μ‚°ν•œλ‹€.

β¬‡οΈμ΅œμ’… μ½”λ“œ

# μ–‘λ°©ν–₯ 큐 λͺ¨λ“ˆμ„ λΆˆλŸ¬μ˜¨λ‹€.
from collections import deque  
# 문제 번호λ₯Ό μ„ΈκΈ° μœ„ν•œ count와, μƒν•˜μ’Œμš° 이동을 μœ„ν•œ dx, dy 배열을 μ •μ˜ν•œλ‹€.
count, dx, dy = 0, [0, 0, 1, -1], [1, -1, 0, 0] 

# λ„ˆλΉ„ μš°μ„  탐색(BFS) ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€.
def bfs(): 
    queue = deque() 
    # μ‹œμž‘μ μ„ queue에 μΆ”κ°€ν•œλ‹€.
    queue.append([0, 0])  
    # μ‹œμž‘μ μ˜ λΉ„μš©μ„ μ΄ˆκΈ°ν™”ν•œλ‹€.
    cost[0][0] = field[0][0]  
    # queue에 μš”μ†Œκ°€ μžˆλŠ” λ™μ•ˆ λ°˜λ³΅ν•œλ‹€.
    while queue:  
        # queueμ—μ„œ μš”μ†Œλ₯Ό ν•˜λ‚˜ κΊΌλ‚΄ x, y에 ν• λ‹Ήν•œλ‹€.
        x, y = queue.popleft() 
        # μƒν•˜μ’Œμš° λ„€ λ°©ν–₯에 λŒ€ν•΄ λ°˜λ³΅ν•œλ‹€.
        for i in range(4):  
            # ν˜„μž¬ μœ„μΉ˜μ—μ„œ 이동할 μƒˆλ‘œμš΄ μœ„μΉ˜λ₯Ό κ³„μ‚°ν•œλ‹€.
            nx, ny = x + dx[i], y + dy[i] 
             # μƒˆλ‘œμš΄ μœ„μΉ˜κ°€ λ²”μœ„ 내에 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
            if -1 < nx < n and -1 < ny < n: 
                # μƒˆλ‘œμš΄ μœ„μΉ˜λ‘œ μ΄λ™ν•˜λŠ” λΉ„μš©μ΄ 더 μ €λ ΄ν•œμ§€ ν™•μΈν•˜κ³  더 μ €λ ΄ν•œ 경우 λΉ„μš©μ„ κ°±μ‹ ν•œ ν›„ κ°±μ‹ λœ μœ„μΉ˜λ₯Ό queue에 μΆ”κ°€ν•œλ‹€.
                if cost[y][x] + field[ny][nx] < cost[ny][nx]: 
                    cost[ny][nx] = cost[y][x] + field[ny][nx] 
                    queue.append([nx, ny]) 
    # λͺ©μ μ§€κΉŒμ§€μ˜ μ΅œμ†Œ λΉ„μš©μ„ λ°˜ν™˜ν•œλ‹€.
    return cost[n-1][n-1]  


while True:
    n = int(input())  
    if n == 0: 
        break  
    # 문제 번호λ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.
    count += 1
    # 지도 정보λ₯Ό μ €μž₯ν•  리슀트λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
    field = []  
    # 지도 정보λ₯Ό μž…λ ₯λ°›μ•„ field에 μ €μž₯ν•œλ‹€.
    for i in range(n): field.append(list(map(int, input().split()))) 
    # 각 μœ„μΉ˜κΉŒμ§€μ˜ μ΅œμ†Œ λΉ„μš©μ„ μ €μž₯ν•  리슀트λ₯Ό λ¬΄ν•œλŒ€λ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
    cost = [[1e9 for j in range(n)] for i in range(n)]  
    # 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.
    print(f"Problem {count}: {bfs()}")  

πŸ“–λ‹€μ΅μŠ€νŠΈλΌλ§Œμ„ μ΄μš©ν•œ 풀이 방법
λ‹€μ΅μŠ€νŠΈλΌλ§Œμ„ μ΄μš©ν•΄μ„œ ν’€ λ•ŒλŠ” μΈμ ‘ν•œ λ…Έλ“œλ₯Ό ꡬ할 λ•Œ ν•΄λ‹Ή μ’Œν‘œμ˜ μƒν•˜ 쒌우λ₯Ό 가지고 였면 λœλ‹€.

πŸ‘€μ½”λ“œλ₯Ό μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ

β¬‡οΈμ΅œμ’… μ½”λ“œ

# λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μœ„ν•΄ νž™ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ˜¨λ‹€.
import heapq
# μž…λ ₯을 λ°›λŠ”λ‹€.
result = []
n = int(input())
while n!=0:
    graph  = [[1] for _ in range(n)]
    for idx in range(n):
        graph[idx] = list(map(int, input().split()))
    # μžƒμ–΄λ²„λ¦¬λŠ” 돈 양을 μ €μž₯ν•˜λŠ” 배열을 μ΄ˆκΈ°ν™”ν•œλ‹€.
    loss = [[float('inf')]*n for _ in range(n) ]
    # μƒν•˜μ’Œμš°λ₯Ό μ΄λ™ν•˜λŠ” λ³€μˆ˜λ₯Ό 각각 μ„ μ–Έν•œλ‹€.
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    # μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
    q = []
    # μš°μ„ μˆœμœ„ 큐에 μ‹œμž‘μ μΈ (0,0)의 정보λ₯Ό λ„£λŠ”λ‹€. 
    heapq.heappush(q,(graph[0][0] , [0,0]))
    # (0,0)μ—μ„œ μ‹œμž‘ν•˜κΈ° λ•Œλ¬Έμ— loss[0][0]을 graph[0][0]으둜 μ§€μ •ν•œλ‹€.
    loss[0][0] = graph[0][0]
    # μš°μ„ μˆœμœ„ 큐가 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
    while q:
        # νμ—μ„œ 제일 weightκ°€ μž‘μ€ 값을 λ½‘μ•„μ˜¨λ‹€.
        weight,(x,y) = heapq.heappop(q)
        # λ§Œμ•½ 이미 κ°€μž₯ μž‘μ€ κ°’μœΌλ‘œ 된 값이면 κ·Έλƒ₯ λ„˜κΈ΄λ‹€.
        if loss[x][y] < weight:
            continue
        # μΈμ ‘ν•œ 4개의 λ…Έλ“œ 쀑 갈 수 μžˆλŠ” λ…Έλ“œ 이면 ν•΄λ‹Ήλ˜λŠ” 문이닀.
        for idx in range(4):
            xx = x + dx[idx]
            yy = y + dy[idx]
            if (0<=xx<n) and (0<=yy<n):
                cost = weight + graph[xx][yy]
                # ν•΄λ‹Ή μ’Œν‘œλ‘œ κ°€λŠ” 값이 μ΅œμ†Œ 값이라면 ν•΄λ‹Ήλ˜λŠ” 문이닀.
                if loss[xx][yy] > cost:
                    # ν•΄λ‹Ή 값을 loss에 μ €μž₯ν•˜κ³  μš°μ„ μˆœμœ„ 큐에 ν•΄λ‹Ή 값을 μΆ”κ°€ν•œλ‹€. 
                    loss[xx][yy] = cost
                    heapq.heappush(q,(cost , [xx,yy]))
    result.append(loss[-1][-1])
    n = int(input())

for idx in range(len(result)):
    print(f"Problem {idx+1}: {result[idx]}")

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

λ‹€μ΅μŠ€νŠΈλΌ,,μ΄λ¦„λ§Œ 듀어도 쉽지 μ•Šμ€ 것 κ°™μ•˜μ§€λ§Œ μ½”λ“œλ₯Ό 찬찬히 λœ―μ–΄λ³΄λ‹ˆ ν•  λ§Œν•œ 것 같기두,,? 음,,,μ’€ 더 λ…Έλ ₯ν•΄ λ³΄μ•„μ•Όκ² μŠ΅λ‹ˆλ‹€,, 갈 길이 λ¨Έλ„€μš”,,ν•˜ν•«πŸ€£πŸ€£

@tgyuuAn
Copy link
Member

tgyuuAn commented Apr 3, 2024

ν—‰ λ­”κ°€ ν˜œμ›λ‹˜μ€ @gjsk132 λ‚˜μ˜λ‹˜μ˜ 슀멜이 쑰금 λ‚˜μš”. (κΈμ •μ˜ μ˜λ―Έμž…λ‹ˆλ‹€...!)

이거 ν•΄λ³Όλž˜μš” ? ν•˜λ©΄ ν•΄λ³΄κ² μ”λ‹ˆλ‹€! ν•˜κ³ ... ν•˜λ‚˜λ₯Ό μ°© κ°€λ₯΄μ³μ£Όλ©΄ λ‘κ°œλ₯Ό μ²™μ²™ν•˜λŠ”... πŸ‘πŸ‘

@janghw0126
Copy link
Member Author

janghw0126 commented Apr 3, 2024

@tgyuuAn νƒœκ·œλ‹˜μ΄ μΆ”μ²œν•΄μ£Όμ‹  덕뢄에 λ‹€μ–‘ν•œ 자료ꡬ쑰λ₯Ό 더 많이 μ•Œμ•„κ°€κ³  μžˆμŠ΅λ‹ˆλ‹€!
μ•žμœΌλ‘œ 더 μšœμ‹¬νžˆ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹·,,,😎😎

@LJEDD2
Copy link
Collaborator

LJEDD2 commented Apr 4, 2024

@janghw0126 큐티걸

Copy link
Collaborator

@Hwangyerin Hwangyerin left a comment

Choose a reason for hiding this comment

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

λ‹€μ΅μŠ€νŠΈλΌ...! μΉœμ ˆν•œ μˆ˜λ„μ½”λ“œ 덕뢄에 μ΄ν•΄ν•˜λŠ”λ° λ§Žμ€ 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!
ν˜œμ›λ‹˜ λŒ€λ‹¨ν•˜μ‹œλ„€μš”.. μ €λŠ” 아직 λ¬΄μ„œμ›Œμ„œ 건듀지 λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€γ…œ
κ·Έλž˜ν”„ κ°œλ…λΆ€ν„° 차근차근히 밟고 λ‹€μ‹œ 이 PR을 μ™„λ²½νžˆ μ΄ν•΄ν•˜κ³  문제 ν’€ 수 μžˆμ„ λ•Œ λ‹€μ‹œ ν’€μ–΄λ΄μ•Όκ² μ–΄μš”
μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!

# 각 μœ„μΉ˜κΉŒμ§€μ˜ μ΅œμ†Œ λΉ„μš©μ„ μ €μž₯ν•  리슀트λ₯Ό λ¬΄ν•œλŒ€λ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.
cost = [[1e9 for j in range(n)] for i in range(n)]
# 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.
print(f"Problem {count}: {bfs()}")
Copy link
Collaborator

Choose a reason for hiding this comment

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

λ§ˆμ§€λ§‰ μ½”λ“œμ—μ„œλŠ” Heapq λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•œ κ²ƒμœΌλ‘œ λ³΄μ΄λŠ”λ° λ„ˆλΉ„ 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œ μ½”λ“œμ™€ μ–΄λ–€ 차이λ₯Ό κ°€μ§€λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€ 🧐🧐🧐

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.

ν˜œμ›λ‹˜μ˜ μƒμ„Έν•œ μ„€λͺ…덕뢄에 잊고 있던 λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μƒκΈ°μ‹œν‚¬ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€!
bfsλ₯Ό μ‚¬μš©ν•œ μ½”λ“œμ™€ λ‹€μ΅μŠ€νŠΈλΌλ§Œμ„ μ‚¬μš©ν•œ μ½”λ“œ λͺ¨λ‘ λ³΄μ—¬μ£Όμ…”μ„œ λ‹€μ–‘ν•œ 방법을 읡힐 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€πŸ˜„πŸ‘ λ§ˆμ§€λ§‰ 좜λ ₯μ—μ„œ f-string도 λ‹€μ‹œκΈˆ 읡히고 κ°‘λ‹ˆλ‹€... μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!!

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