ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 2841 μ™Έκ³„μΈμ˜ 기타 μ—°μ£Ό with Python
    PS 2021. 12. 1. 21:51
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 2841 μ™Έκ³„μΈμ˜ 기타 μ—°μ£Ό

    πŸ’‘ 쑰건

    1. λ©œλ‘œλ””λŠ” 음의 연속이고, 각 μŒμ€ μ€„μ—μ„œ ν•΄λ‹Ήν•˜λŠ” 프렛을 λˆ„λ₯΄κ³  쀄을 νŠ•κΈ°λ©΄ μ—°μ£Όν•  수 μžˆλ‹€.
    2. μ–΄λ–€ μ€„μ˜ 프렛을 μ—¬λŸ¬ 개 λˆ„λ₯΄κ³  μžˆλ‹€λ©΄, κ°€μž₯ 높은 ν”„λ ›μ˜ 음이 λ°œμƒ.
    3. λ©œλ‘œλ””μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” 음의 수 Nκ³Ό ν•œ 쀄에 μžˆλŠ” ν”„λ ›μ˜ 수 Pκ°€ 주어진닀. (N ≀ 500,000, 2 ≀ P ≀ 300,000)
    4. 2번 ν”„λ ›μ˜ μŒμ„ μ—°μ£Όν•˜λ €κ³  ν•œλ‹€λ©΄, 5번과 7λ²ˆμ„ λˆ„λ₯΄λ˜ 손가락을 λ—€ λ‹€μŒμ— 2번 프렛을 λˆ„λ₯΄κ³  μ—°μ£Όν•΄μ•Ό ν•œλ‹€.
    5. μ†κ°€λ½μ˜ κ°€μž₯ 적게 μ›€μ§μ΄λŠ” 회수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±.
    6. Stack, 자료ꡬ쑰 μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    import heapq
    
    n, p = map(int, stdin.readline().split())
    stack = [[] for _ in range(7)]
    res = 0
    
    for _ in range(n):
        j, f = map(int, stdin.readline().split())
    
        if not stack[j]:
            heapq.heappush(stack[j], f)
            res += 1
    
        elif stack[j][-1] < f:
            heapq.heappush(stack[j], f)
            res += 1
    
        elif stack[j][-1] > f:
            while 1:
                if not stack[j]:
                    res += 1
                    stack[j].append(f)
                    break
                if stack[j][-1] <= f:
                    if stack[j][-1] < f:
                        heapq.heappush(stack[j], f)
                        res += 1
                    break
                stack[j].pop()
                res += 1
    
    print(res)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    7 15
    1 5
    2 3
    2 5
    2 7
    2 4
    1 5
    1 3

    μ‹€ν–‰κ²°κ³Ό

    9

    ⌨️ 문제 풀이

    1. κΈ°νƒ€μ˜ 쀄을 μ˜λ―Έν•˜λŠ” stack 2차원 리슀트λ₯Ό μƒμ„±ν•œλ‹€.
      μŠ€νƒμ˜ 각 μ›μ†Œμ— ν•΄λ‹Ήν•˜λŠ” λ¦¬μŠ€νŠΈμ—λŠ” λˆ„λ₯΄κ³  μžˆλŠ” ν”„λ › 숫자 데이터가 μ €μž₯λœλ‹€.

    2. μž…λ ₯을 λ°›μœΌλ©΄μ„œ, ν”„λ › 숫자λ₯Ό 각 쀄에 ν•΄λ‹Ήν•˜λŠ” λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€.

    3. μž…λ ₯받은 쀄에 ν•΄λ‹Ήν•˜λŠ” λ¦¬μŠ€νŠΈμ— 이미 λˆ„λ₯΄κ³  μžˆλŠ” 프렛에 ν•΄λ‹Ήν•˜λŠ” 데이터가 μžˆλ‹€λ©΄,
      μž…λ ₯받은 ν”„λ › λ²ˆν˜Έκ°€ 이미 λˆ„λ₯΄κ³  μžˆλŠ” ν”„λ ›μ˜ λ²ˆν˜Έλ³΄λ‹€ μž‘μ•„μ§ˆ λ•ŒκΉŒμ§€ pop()을 ν•΄μ£Όλ©΄μ„œ res += 1을 ν•΄μ€€λ‹€.
      λ§Œμ•½ pop() 을 ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ λ°”λ‘œ μΆ”κ°€ν•΄μ€€λ‹€.

    4. ν”„λ ›μ˜ λ²ˆν˜Έκ°€ 겹치면 더 ν•΄λ‹Ή 쀄에 ν”„λ › 번호λ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šκ³ , κ²ΉμΉ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μΆ”κ°€ν•˜κ³ , res += 1을 ν•΄μ€€λ‹€.

    5. n만큼 λ°˜λ³΅ν–ˆλ‹€λ©΄, res λ₯Ό 좜λ ₯ν•œλ‹€.

    πŸ’Ύ λŠλ‚€μ 

    1. stack 자료ꡬ쑰λ₯Ό ν™œμš”ν•˜λŠ” λ¬Έμ œμ˜€λ‹€.
    2. 아이디어λ₯Ό λ– μ˜¬λ¦¬κΈ°κΉŒμ§€ μ‹œκ°„μ΄ κ½€ κ±Έλ¦° λ¬Έμ œμ˜€λ‹€.
    3. stack 의 κ°œλ…μ„ μ•Œλ©΄, 이λ₯Ό λ‹€μ–‘ν•œ 방면으둜 ν™œμš©ν•  수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ ν•΄μ£Όμ—ˆλ‹€.
    4. 자료ꡬ쑰 λ¬Έμ œλŠ” 쒋은 아이디어λ₯Ό λ– μ˜¬λ¦΄ 수 있게 많이 풀어봐야겠닀.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.