Algorithm Problem/Python

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 풍선 ν„°νŠΈλ¦¬κΈ°(μ›”κ°„ μ½”λ“œ μ±Œλ¦°μ§€ μ‹œμ¦Œ1)

deo2kim 2020. 9. 25. 08:08
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • Lv3 

풍선이 살아남을 수 μžˆλŠ” 쑰건:

  • λ‚΄ 풍선 κΈ°μ€€ μ™Όμͺ½ 풍선 크기가 클 λ•Œ
  • λ‚΄ 풍선 κΈ°μ€€ 였λ₯Έμͺ½ 풍선 크기가 클 λ•Œ
  • λ§Œμ•½ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ λ‘˜λ‹€ 크기가 μž‘μœΌλ©΄ 풍선은 μ£½λŠ”λ‹€

이 λ¬Έμ œμ—μ„œ 핡심은 ν’μ„ μ˜ 크기가 κ°€μž₯ μž‘μ€ 녀석듀을 ν•˜λ‚˜μ”© 뽑아주면 λ˜λŠ” 것!

졜초 인풋 κ°’ (ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€2)

값을 κΈ°μ€€μœΌλ‘œ 정렬을 ν•΄μ£Όλ©΄

  • 크기가 κ°€μž₯ μž‘μ€ 풍선(5)은 무쑰건 μ‚΄μ•„λ‚¨λŠ”λ‹€. - (λͺ¨λ‘ λ‹€ ν„°νŠΈλ¦΄ 수 μžˆλ‹€)
  • 크기가 λ‘λ²ˆμ§Έλ‘œ μž‘μ€ 풍선(6)도 무쑰건 μ‚΄μ•„λ‚¨λŠ”λ‹€. - (μžμ‹ λ³΄λ‹€ μž‘μ€ 풍선(5)을 ν„°νŠΈλ¦΄ μ°¬μŠ€κ°€ 1번 있기 λ•Œλ¬Έ)
  • 크기가 μ„Έλ²ˆμ§Έλ‘œ μž‘μ€ 풍선(7) λΆ€ν„°λŠ” 인덱슀의 상황에 따라 κ²°μ •λœλ‹€.
    λ§Œμ•½ 7이 μ•žμ˜ 두 풍선 사이에 μžˆμ„ 경우 μžμ‹ μ˜ μ–‘μͺ½μ΄ λͺ¨λ‘ μž‘κΈ° λ•Œλ¬Έμ— 풍선은 μ£½λŠ”λ‹€.
    ν•˜μ§€λ§Œ 두 풍선 사이가 μ•„λ‹ˆλΌλ©΄ ( 5 < 6 < 7 )
    7 ν’μ„ μ˜ 였λ₯Έμͺ½μ€ λͺ¨λ‘ 7 풍선 보닀 크기가 크기 λ•Œλ¬Έμ— λ‹€ ν„°νŠΈλ¦΄ 수 μžˆλ‹€.
    7 ν’μ„ μ˜ μ™Όμͺ½μ€ 5 풍선이 λ‹€λ₯Έ λͺ¨λ“  풍선을 ν„°νŠΈλ¦΄ 수 μžˆλ‹€.
    결과적으둜 7 풍선과 5 풍선이 λ‚¨κ²Œ 되면 찬슀λ₯Ό μ‚¬μš©ν•΄ 5 풍선을 ν„°νŠΈλ¦°λ‹€.
    !! μš”μ•½ν•˜μžλ©΄ μ•žμ˜ 두 풍선사이에 듀어가지 μ•ŠλŠ”λ‹€λ©΄ 풍선은 μ‚΄μ•„λ‚¨κ²Œ λ˜λŠ” 것!

πŸ’¨ λ‚˜μ˜ 경우 sortλ₯Ό λ”°λ‘œ 해주기보닀 μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν–ˆλ‹€(νž™ν)

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import heapq


def solution(a):
    if len(a) < 3:
        return len(a)
    answer = 2
    pq = []
    for i in range(len(a)):
        heapq.heappush(pq, (a[i], i))

    left = heapq.heappop(pq)[1]
    right = heapq.heappop(pq)[1]
    if left > right:
        left, right = right, left

    while pq:
        c = heapq.heappop(pq)[1]
        if c < left:
            answer += 1
            left = c
        elif c > right:
            answer += 1
            right = c

    return answer

 

πŸ“•λ¬Έμ œ 확인

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

링크: https://programmers.co.kr/learn/courses/30/lessons/68646?language=python3

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 풍선 ν„°νŠΈλ¦¬κΈ°

[-16,27,65,-2,58,-92,-71,-68,-61,-33] 6

programmers.co.kr


문제 μ„€λͺ…

일렬둜 λ‚˜μ—΄λœ n개의 풍선이 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  ν’μ„ μ—λŠ” μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ 써져 μžˆμŠ΅λ‹ˆλ‹€. 당신은 λ‹€μŒ 과정을 λ°˜λ³΅ν•˜λ©΄μ„œ 풍선듀을 단 1개만 남을 λ•ŒκΉŒμ§€ 계속 ν„°νŠΈλ¦¬λ €κ³  ν•©λ‹ˆλ‹€.

  1. μž„μ˜μ˜ μΈμ ‘ν•œ λ‘ 풍선을 κ³ λ₯Έ λ’€, 두 풍선 쀑 ν•˜λ‚˜λ₯Ό ν„°νŠΈλ¦½λ‹ˆλ‹€.
  2. 터진 ν’μ„ μœΌλ‘œ 인해 풍선듀 사이에 빈 곡간이 생겼닀면, 빈 곡간이 없도둝 풍선듀을 μ€‘μ•™μœΌλ‘œ λ°€μ°©μ‹œν‚΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 쑰건이 μžˆμŠ΅λ‹ˆλ‹€. μΈμ ‘ν•œ 두 풍선 μ€‘μ—μ„œ λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ¦¬λŠ” ν–‰μœ„λŠ” μ΅œλŒ€ 1번만 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, μ–΄λ–€ μ‹œμ μ—μ„œ μΈμ ‘ν•œ 두 풍선 쀑 λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ Έλ‹€λ©΄, κ·Έ μ΄ν›„μ—λŠ” μΈμ ‘ν•œ 두 풍선을 κ³ λ₯Έ λ’€ λ²ˆν˜Έκ°€ 더 큰 ν’μ„ λ§Œμ„ ν„°νŠΈλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

당신은 μ–΄λ–€ 풍선이 μ΅œν›„κΉŒμ§€ 남을 수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μœ„μ— μ„œμˆ λœ μ‘°κ±΄λŒ€λ‘œ 풍선을 ν„°νŠΈλ¦¬λ‹€ 보면, μ–΄λ–€ 풍선은 μ΅œν›„κΉŒμ§€ 남을 μˆ˜λ„ μžˆμ§€λ§Œ, μ–΄λ–€ 풍선은 무슨 수λ₯Ό 쓰더라도 λ§ˆμ§€λ§‰κΉŒμ§€ λ‚¨κΈ°λŠ” 것이 λΆˆκ°€λŠ₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

일렬둜 λ‚˜μ—΄λœ ν’μ„ λ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ aκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μœ„μ— μ„œμˆ λœ κ·œμΉ™λŒ€λ‘œ 풍선듀을 1개만 남을 λ•ŒκΉŒμ§€ ν„°νŠΈλ Έμ„ λ•Œ μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 것이 κ°€λŠ₯ν•œ ν’μ„ λ“€μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œ 사항

  • a의 κΈΈμ΄λŠ” 1 이상 1,000,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • a[i]λŠ” i+1 번째 풍선에 써진 숫자λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
    • a의 λͺ¨λ“  μˆ˜λŠ” -1,000,000,000 이상 1,000,000,000 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.
    • a의 λͺ¨λ“  μˆ˜λŠ” μ„œλ‘œ λ‹€λ¦…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

a result
[9,-1,-5] 3
[-16,27,65,-2,58,-92,-71,-68,-61,-33] 6

 

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

μž…μΆœλ ₯ 예 #1

  • 첫 번째 풍선(9κ°€ 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    1. [9, -1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -1이 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    2. [9, -5] μ—μ„œ 9, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -5κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 μž‘μ€ 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
  • 두 번째 풍선(-1이 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    1. [9, -1, -5] μ—μ„œ 9, -1이 써진 풍선을 κ³ λ₯Έ λ’€, 9κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    2. [-1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -5κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 μž‘μ€ 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
  • μ„Έ 번째 풍선(-5κ°€ 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    1. [9, -1, -5] μ—μ„œ 9, -1이 써진 풍선을 κ³ λ₯Έ λ’€, 9κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    2. [-1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -1이 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
  • 3개의 풍선이 μ΅œν›„κΉŒμ§€ 남을 수 μžˆμœΌλ―€λ‘œ, 3을 return ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • μ΅œν›„κΉŒμ§€ 남을 수 μžˆλŠ” 풍선은 -16, -92, -71, -68, -61, -33이 써진 ν’μ„ μœΌλ‘œ λͺ¨λ‘ 6κ°œμž…λ‹ˆλ‹€.
λ°˜μ‘ν˜•