[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 풍선 ν„°λœ¨λ¦¬κΈ° / 파이썬 / (μ΅œμ†Œ, μ΅œλŒ€, νž™)
Problem Solving πŸ”₯/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 풍선 ν„°λœ¨λ¦¬κΈ° / 파이썬 / (μ΅œμ†Œ, μ΅œλŒ€, νž™)

문제 μ„€λͺ…

풍선 ν„°νŠΈλ¦¬κΈ°

문제 μ„€λͺ…

일렬둜 λ‚˜μ—΄λœ 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의 λͺ¨λ“  μˆ˜λŠ” μ„œλ‘œ λ‹€λ¦…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

result

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

풀이

처음 λ³΄μ•˜μ„ λ•Œ, μ–΄λ–»κ²Œ ν’€μ–΄μ•Όν• μ§€ 감이 μ˜€μ§€ μ•Šμ•˜λ‹€.
예제λ₯Ό 보고 쑰금 생각을 ν•΄λ³΄μ•˜λŠ”λ°, 감을 μž‘μ•˜λ‹€.
μš°μ„  κ°€μž₯ 큰 값을 κΈ°μ€€μœΌλ‘œ, 값을 λ‚˜λˆ„μ–΄μ•Ό ν•œλ‹€.
λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ¦¬λŠ” ν–‰μœ„λŠ” μ΅œλŒ€ 1λ²ˆμ΄λ‹€.
λ”°λΌμ„œ μ–΄λŠ 풍선이 λ‚¨μœΌλ €λ©΄, κ·Έ 1번의 ν–‰μœ„λŠ” λ°˜λ“œμ‹œ κ°€μž₯ μž‘μ€ κ°’κ³Ό κ·Έ 풍선 2κ°œκ°€ λ‚¨μ•˜μ„ λ•Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
( A )κ°€μž₯ μž‘μ€ κ°’( B ) 둜 λ‚˜λˆ„μ—ˆμ„ λ•Œλ₯Ό λ‹€μŒκ³Ό κ°™λ‹€κ³  μƒκ°ν•΄λ³΄μž.
[( a, b, c, d, e) κ°€μž₯ μž‘μ€ κ°’ (f, g, h, i, j)]
생각해보면 a와 jλŠ” 무쑰건 κ°€λŠ₯함을 μ•Œ 수 μžˆλ‹€. μ™œλƒλ©΄ κ°€μž₯ μž‘μ€ 값이 (b, c, d, e), (f, g, h, i)λ₯Ό ν„°νŠΈλ¦΄ 수 있기 λ•Œλ¬Έμ΄λ‹€.
κ·Έλ ‡λ‹€λ©΄, bκ°€ λ‚¨μœΌλ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? 쉽닀. a보닀 μž‘μœΌλ©΄ λœλ‹€.
cκ°€ λ‚¨μœΌλ €λ©΄? a, b 보닀 μž‘μœΌλ©΄ λœλ‹€.
즉 κ·Έ 값이 κ°€μž₯ μž‘μ€κ°€?λ₯Ό ν™•μΈν•˜λŠ” 문제인데 λ‚˜μ˜ 경우 min heap 자료ꡬ쑰λ₯Ό μ΄μš©ν•΄μ„œ ν’€μ—ˆλ‹€.
μ½”λ“œλ₯Ό 읽어보면 이해가 될 것이닀.

import heapq

def solution(a):
    answer = 0
    min_h = []

    idx = a.index(min(a))
    left = a[:idx]
    right = reversed(a[idx+1:])

    for v in left:
        heapq.heappush(min_h, v)
        if min_h[0] == v:
            answer += 1

    min_h = []
    for v in right:
        heapq.heappush(min_h, v)
        if min_h[0] == v:
            answer += 1

    return answer + 1

무엇을 더 κ°œμ„ ν•  수 μžˆλŠ”κ°€?

사싀 heap 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
κ·Έλƒ₯ μ΅œλŒ€κ°’, μ΅œμ†Œκ°’μ„ 계속 μ €μž₯ν•˜κ³  있으면 λ˜λ‹ˆ 말이닀.
λ‹€μŒμ€ κ·Έ 풀이이닀.

def solution(a):
    answer = 0
    left, right = float('inf'), float('inf')
    min_map = [[0, 0] for _ in range(len(a))]

    # μ™Όμͺ½ λ²”μœ„μ—μ„œ μ΅œμ†Ÿκ°’ μ°ΎκΈ°
    for i in range(len(a)):
        if left > a[i]:
            left = a[i]
        min_map[i][0] = left

    # 였λ₯Έμͺ½ λ²”μœ„μ—μ„œ μ΅œμ†Ÿκ°’ μ°ΎκΈ°
    for i in range(len(a) - 1, -1, -1):
        if right > a[i]:
            right = a[i]
        min_map[i][1] = right

    # 찾은 μ΅œμ†Ÿκ°’ 데이터λ₯Ό κ°€μ§€κ³  κΈ°μ€€ 숫자의 μ–‘μͺ½μ΄ λͺ¨λ‘ κΈ°μ€€ μˆ«μžλ³΄λ‹€ μž‘μœΌλ©΄ answer += 1
    for i in range(len(a)):
        if a[i] <= min_map[i][0] or a[i] <= min_map[i][1]:
            answer += 1

    return answer