🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] ν”Όλ‘œλ„ (level2, python)

개발자 HOON 2022. 9. 13. 13:46

문제 μ„€λͺ…

 

XXκ²Œμž„μ—λŠ” ν”Όλ‘œλ„ μ‹œμŠ€ν…œ(0 μ΄μƒμ˜ μ •μˆ˜λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€)이 있으며, 일정 ν”Όλ‘œλ„λ₯Ό μ‚¬μš©ν•΄μ„œ λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 각 λ˜μ „λ§ˆλ‹€ νƒν—˜μ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 λ˜μ „ νƒν—˜μ„ λ§ˆμ³€μ„ λ•Œ μ†Œλͺ¨λ˜λŠ” "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ μžˆμŠ΅λ‹ˆλ‹€. "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” ν•΄λ‹Ή λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄ 가지고 μžˆμ–΄μ•Ό ν•˜λŠ” μ΅œμ†Œν•œμ˜ ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λ‚΄λ©°, "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” λ˜μ „μ„ νƒν—˜ν•œ ν›„ μ†Œλͺ¨λ˜λŠ” ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"κ°€ 80, "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ 20인 λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ μ €μ˜ ν˜„μž¬ 남은 ν”Όλ‘œλ„λŠ” 80 이상 이어야 ν•˜λ©°, λ˜μ „μ„ νƒν—˜ν•œ ν›„μ—λŠ” ν”Όλ‘œλ„ 20이 μ†Œλͺ¨λ©λ‹ˆλ‹€.

 

이 κ²Œμž„μ—λŠ” ν•˜λ£¨μ— ν•œ λ²ˆμ”© νƒν—˜ν•  수 μžˆλŠ” λ˜μ „μ΄ μ—¬λŸ¬κ°œ μžˆλŠ”λ°, ν•œ μœ μ €κ°€ 였늘 이 λ˜μ „λ“€μ„ μ΅œλŒ€ν•œ 많이 νƒν—˜ν•˜λ € ν•©λ‹ˆλ‹€. μœ μ €μ˜ ν˜„μž¬ ν”Όλ‘œλ„ k와 각 λ˜μ „λ³„ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ λ‹΄κΈ΄ 2차원 λ°°μ—΄ dungeons κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μœ μ €κ°€ νƒν—˜ν• μˆ˜ μžˆλŠ” μ΅œλŒ€ λ˜μ „ 수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

 

  • kλŠ” 1 이상 5,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • dungeons의 μ„Έλ‘œ(ν–‰) 길이(즉, λ˜μ „μ˜ 개수)λŠ” 1 이상 8 μ΄ν•˜μž…λ‹ˆλ‹€.
    • dungeons의 κ°€λ‘œ(μ—΄) κΈΈμ΄λŠ” 2 μž…λ‹ˆλ‹€.
    • dungeons의 각 행은 각 λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"] μž…λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 항상 "μ†Œλͺ¨ ν”Όλ‘œλ„"보닀 ν¬κ±°λ‚˜ κ°™μŠ΅λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 1 이상 1,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
    • μ„œλ‘œ λ‹€λ₯Έ λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"]κ°€ μ„œλ‘œ 같을 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

μž…μΆœλ ₯ 예 μ„€λͺ…

 

ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80μž…λ‹ˆλ‹€.

λ§Œμ•½, 첫 번째 → 두 번째 → μ„Έ 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 20μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 20이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ„Έ 번째 λ˜μ „μ€ νƒν—˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½, 첫 번째 → μ„Έ 번째 → 두 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μ΄λ―€λ‘œ, μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„Έ 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 10μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 50μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 50이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 10μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 이 경우 μ„Έ λ˜μ „μ„ λͺ¨λ‘ νƒν—˜ν•  수 있으며, μœ μ €κ°€ νƒν—˜ν•  수 μžˆλŠ” μ΅œλŒ€ λ˜μ „ μˆ˜λŠ” 3μž…λ‹ˆλ‹€.


풀이 μ½”λ“œ

from collections import deque

def bfs(start, k, dungeons):
    queue = deque()
    queue.append([start, k, 0, [False for _ in range(len(dungeons))]])
    counted = []
    
    while queue:
        location, tired, count, visited = queue.popleft()
        visited[location] = True
        tired -= dungeons[location][1]
        count += 1
        counted.append(count)
        
        for i in range(len(dungeons)):
            if not visited[i] and tired >= dungeons[i][0]:
                queue.append([i, tired, count, visited[:]])
                
    return max(counted)

def solution(k, dungeons):
    answer = -1
    for i in range(len(dungeons)):
        if dungeons[i][0] <= k:
            answer = max(answer, bfs(i, k, dungeons))
    return answer

BFSλ₯Ό μ‚¬μš©ν•˜μ—¬ ν’€μ΄ν•˜μ˜€κ³ , λͺ¨λ“  루트λ₯Ό ν™•μΈν•˜λŠ” 완전탐색 λ¬Έμ œμ˜€λ‹€.

사싀 permutation λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄μ„œ 풀이해도 λ˜μ§€λ§Œ, BFSλ₯Ό μ‚¬μš©ν•΄μ„œ ν’€μ—ˆλ‹€.

 

완전탐색이 κ°€λŠ₯ν•œ μ΄μœ λŠ” λ˜μ „μ˜ κ°œμˆ˜κ°€ μ΅œλŒ€ 8κ°œλ°–μ— λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점이닀.

μ²˜μŒμ— μž…μž₯ κ°€λŠ₯ν•œ λ˜μ „μ— λŒ€ν•΄μ„œλ§Œ bfs 좜발점으둜 μ‚ΌλŠ”λ‹€.

 

각각의 λ£¨νŠΈλ§ˆλ‹€ λ‹€λ₯Έ λ˜μ „μ„ λ°©λ¬Έν–ˆλŠ”μ§€ 확인해주기 μœ„ν•΄μ„œ,

큐의 μ›μ†Œ 내에 visitedλ₯Ό ν¬ν•¨ν•΄μ£Όμ—ˆλ‹€.

큐 λ‚΄λΆ€μ—λŠ” [ν˜„μž¬ μœ„μΉ˜, ν”Όλ‘œλ„, λ˜μ „ 총 λ°©λ¬Έ 횟수, λ˜μ „ 별 λ°©λ¬Έ μ—¬λΆ€ λ°°μ—΄]와 같은 μ›μ†Œλ“€μ΄ ν¬ν•¨λ˜μ–΄ 있고, 

이 것은 ν•˜λ‚˜μ˜ 큐의 μ›μ†Œκ°€ λ‘œμ§μ„ κ±°μΉ˜λŠ” 것 = 각각의 경둜λ₯Ό μ˜λ―Έν•˜λŠ” 것이닀.

 

μ΄λ•Œ μ£Όμ˜ν•΄μ£Όμ–΄μ•Ό ν•  점은, 큐에 μƒˆλ‘œμš΄ μ›μ†Œλ₯Ό append ν•  λ•Œμ΄λ‹€.

아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜κ³ , μž…μž₯ ν”Όλ‘œλ„κ°€ μ œν•œμ— 걸리지 μ•Šμ€ 경우 appendλ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ°,

visitedλ₯Ό κΌ­ λ³΅μ‚¬ν•΄μ„œ λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

λ˜μ „ λ°©λ¬Έ 횟수 쀑 κ°€μž₯ 많이 λ°©λ¬Έν•œ 것을 κ³„μ†ν•΄μ„œ κ°±μ‹ ν•΄μ£Όλ©΄ λ¬Έμ œκ°€ ν’€λ¦°λ‹€.