Skip to main content

πŸš€ 1046. λ§ˆμ§€λ§‰ 돌의 무게

λ§ˆμ§€λ§‰ 돌의 λ¬΄κ²Œβ€‹

Last Stone Weight - LeetCode

문제 μ„€λͺ…​

μ •μˆ˜ λ°°μ—΄ stonesκ°€ μ£Όμ–΄μ§€λ©°, stones[i]λŠ” i번째 돌의 무게λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μš°λ¦¬λŠ” λŒμ„ κ°€μ§€κ³  κ²Œμž„μ„ ν•©λ‹ˆλ‹€. λ§€ ν„΄λ§ˆλ‹€ κ°€μž₯ 무거운 두 개의 λŒμ„ μ„ νƒν•˜μ—¬ μ„œλ‘œ λΆ€λ”ͺνž™λ‹ˆλ‹€. x와 yλ₯Ό 각각 두 돌의 무게라고 ν•  λ•Œ (x ≀ y), λΆ€λ”ͺ힌 κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • λ§Œμ•½ x == y라면, 두 돌 λͺ¨λ‘ νŒŒκ΄΄λ©λ‹ˆλ‹€.
  • λ§Œμ•½ x != y라면, x 무게의 λŒμ€ 파괴되고, y 무게의 λŒμ€ y - x의 μƒˆλ‘œμš΄ 무게λ₯Ό κ°–κ²Œ λ©λ‹ˆλ‹€.

κ²Œμž„μ΄ 끝날 λ•ŒλŠ” μ΅œλŒ€ ν•œ 개의 돌만 λ‚¨κ²Œ λ©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μ— 남은 돌의 무게λ₯Ό λ°˜ν™˜ν•˜μ„Έμš”. 남은 돌이 μ—†λ‹€λ©΄ 0을 λ°˜ν™˜ν•˜μ„Έμš”.

예제 1:​

μž…λ ₯: stones = [2,7,4,1,8,1]
좜λ ₯: 1
μ„€λͺ…:
7κ³Ό 8을 λΆ€λ”ͺν˜€μ„œ 1이 λ˜μ–΄ 배열은 [2,4,1,1,1]이 λ©λ‹ˆλ‹€.
2와 4λ₯Ό λΆ€λ”ͺν˜€μ„œ 2κ°€ λ˜μ–΄ 배열은 [2,1,1,1]이 λ©λ‹ˆλ‹€.
2와 1을 λΆ€λ”ͺν˜€μ„œ 1이 λ˜μ–΄ 배열은 [1,1,1]이 λ©λ‹ˆλ‹€.
1κ³Ό 1을 λΆ€λ”ͺν˜€μ„œ 0이 λ˜μ–΄ 배열은 [1]이 되고, 이것이 λ§ˆμ§€λ§‰ 돌의 λ¬΄κ²Œμž…λ‹ˆλ‹€.

예제 2:​

μž…λ ₯: stones [1]
좜λ ₯: 1

μ œμ•½ 쑰건:​

- 1 <= stones.length <= 30
- 1 <= stones[i] <= 1000

ν•΄κ²° 방법​

class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
while stones and stones[-1]:
stones = heapq.nsmallest(len(stones), stones)
if len(stones) == 1:
return stones.pop()
elif len(stones) == 2:
return stones.pop() - stones.pop()
item1 = stones.pop()
item2 = stones.pop()
if item1 - item2 is not 0:
stones.append(item1 - item2)

κ²°κ³Ό runtime : 30ms 96.20%

근데 μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λŠ”κ±°λ©΄ κ·Έλƒ₯ sortμ“°λŠ”κ²Œ λ§žμ§€ μ•Šλ‚˜ 생각?

λ‹€λ₯Έ μ‚¬λžŒλ“€μ€ μ–΄λ–»κ²Œ ν’€μ—ˆλ‚˜ ν™•μΈν•΄λ³΄λ‹ˆ

class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
stones = [-stone for stone in stones]
heapq.heapify(stones)
while len(stones) > 1:
y = heapq.heappop(stones)
x = heapq.heappop(stones)
if x != y:
heapq.heappush(stones, y - x)
return -stones[0] if stones else 0

λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ ν‘Ό κ²°κ³ΌλŠ” 이렇닀.

κ·ΈλŸ¬λ‹ˆκΉŒ heapqλŠ” λͺ¨λ“ˆμ΄κ³  κ·Έκ±Έ κ·ΈλŒ€λ‘œ ν™œμš©ν•˜λŠ”λ° μš”μ†Œλ“€μ˜ 값을 λ‹€ λ§ˆμ΄λ„ˆμŠ€λ‘œ λ°”κΎΈκ³  λ§ˆμ΄λ„ˆμŠ€λ‘œ 바뀐 μš”μ†Œλ₯Ό νž™ 정렬해버리면 ν°μˆ˜λŒ€λ‘œ μ΄μ§„νŠΈλ¦¬λ‘œ μ •λ ¬λ˜κ³  μ΅œμ’… 결과에 -만 λΆ™μ—¬μ„œ λ°˜μ˜ν•˜λ©΄ 됨

μ„€λͺ…​

이 해결방법은 Python의 heapq λͺ¨λ“ˆμ„ μ‚¬μš©ν•©λ‹ˆλ‹€:

  1. λͺ¨λ“  돌의 무게λ₯Ό 음수둜 λ³€ν™˜ν•©λ‹ˆλ‹€ (μ΅œλŒ€ νž™μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄)
  2. heapifyλ₯Ό μ‚¬μš©ν•˜μ—¬ νž™μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€
  3. 돌이 2개 이상 λ‚¨μ•„μžˆλŠ” λ™μ•ˆ:
    • κ°€μž₯ 큰 두 λŒμ„ κΊΌλƒ…λ‹ˆλ‹€ (μŒμˆ˜μ΄λ―€λ‘œ μ‹€μ œλ‘œλŠ” κ°€μž₯ μž‘μ€ κ°’)
    • 두 돌의 차이가 μžˆλ‹€λ©΄ μƒˆλ‘œμš΄ λŒμ„ νž™μ— μΆ”κ°€ν•©λ‹ˆλ‹€
  4. λ§ˆμ§€λ§‰ 돌이 λ‚¨μ•„μžˆλ‹€λ©΄ κ·Έ 값을 μ–‘μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•˜κ³ , μ—†λ‹€λ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€

μ°Έκ³  url 은 λ‹€μŒκ³Ό κ°™λ‹€.

μ°Έκ³  μžλ£Œβ€‹

heapq - Heap queue algorithm