ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 3151 합이 0 with Python
    PS 2022. 6. 1. 01:22
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 3151 합이 0

    πŸ’‘ 쑰건

    1. 1 ≀ N ≀ 10000
      -10000 ≀ Ai ≀ 10000
    1. λŒ€νšŒλŠ” μ •ν™•νžˆ 3λͺ…μœΌλ‘œ κ΅¬μ„±λœ νŒ€λ§Œ μ°Έκ°€κ°€ κ°€λŠ₯ν•˜λ‹€.
    1. μ½”λ”© μ‹€λ ₯이 μ’‹μœΌλ©΄ νŒ€μ›Œν¬κ°€ 떨어지고, νŒ€μ›Œν¬κ°€ μ’‹μ„μˆ˜λ‘ μ½”λ”© μ‹€λ ₯이 떨어진닀. 그리고 μΆœμ „ν•˜κ³ μž ν•˜λŠ” λŒ€νšŒλŠ” μ½”λ”© μ‹€λ ₯κ³Ό νŒ€μ›Œν¬ λͺ¨λ‘κ°€ μ€‘μš”ν•˜λ‹€.
      μ„Έ νŒ€μ›μ˜ μ½”λ”© μ‹€λ ₯의 합이 0이 λ˜λŠ” νŒ€μ„ λ§Œλ“€κ³ μž ν•œλ‹€.
    1. λŒ€νšŒμ— μΆœμ „ν•  수 μžˆλŠ” νŒ€μ„ μ–Όλ§ˆλ‚˜ 많이 λ§Œλ“€ 수 μžˆλŠ”μ§€λ₯Ό κ³„μ‚°ν•˜μ—¬λΌ.
    1. Nλͺ…μ˜ ν•™μƒλ“€μ˜ μ½”λ”© μ‹€λ ₯ Aiκ°€ -10000λΆ€ν„° 10000μ‚¬μ΄μ˜ μ •μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 합이 0이 λ˜λŠ” 3인쑰λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 문제.
    1. 이뢄 탐색, 투 포인터 μœ ν˜•μ˜ 문제

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

    from sys import stdin
    # 이뢄탐색
    
    n = int(stdin.readline())
    arr = list(map(int, stdin.readline().split()))
    arr.sort()
    ans = 0
    
    
    def solve(s, e, g):
        global ans
        max_idx = n
        while s < e:
            tmp = arr[s] + arr[e]
            if tmp < goal:
                s += 1
    
            elif tmp == g:
                if arr[s] == arr[e]:
                    ans += e - s
    
                else:
                    if max_idx > e:
                        max_idx = e
                        while max_idx >= 0 and arr[max_idx - 1] == arr[e]:
                            max_idx -= 1
                    ans += e - max_idx + 1
                s += 1
            else:
                e -= 1
    
    
    for i in range(n - 2):
        start = i + 1
        end = n - 1
        goal = -arr[i]
        solve(start, end, goal)
    
    print(ans)

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

    예제

    10
    2 -5 2 3 -4 7 -4 0 1 -6

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

    6

    힌트

    μ˜ˆμ‹œμ—μ„œ κ°€λŠ₯ν•œ μ°Έκ°€μž 그룹은 μ•„λž˜μ™€ κ°™λ‹€.

    (2, -5, 3), (2, 2, -4), (2, 2, -4), (-5, 2, 3), (3, -4, 1), (3, -4, 1)

    두 개의 -4λŠ” μ„œλ‘œ λ‹€λ₯Έ μ°Έκ°€μžλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것에 μœ μ˜ν•˜λΌ. (2, 2, -4)와 (3, -4, 1)이 두 λ²ˆμ”© λ‚˜νƒ€λ‚œλ‹€.

    ⌨️ 문제 풀이

    1. 이뢄 탐색은 μˆœμ„œλ₯Ό 보μž₯ν•΄μ•Όν•˜λŠ” λ¦¬μŠ€νŠΈμ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 것을 μΈμ§€ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.
      이뢄 탐색할 리슀트λ₯Ό μ •λ ¬ν•΄μ€€λ‹€.
      3151번 λ¬Έμ œλŠ” μˆœμ„œμ™€ 상관없이 3λͺ…μ˜ 인원을 뽑아 μ½”λ”© μ‹€λ ₯의 합이 0이 λ˜λŠ” 쑰합을 μ°Ύμ•„μ•Ό ν•œλ‹€.
    1. μž…λ ₯을 받은 리슀트의 길이의 -2 만큼 μˆœνšŒν•œλ‹€.
      μˆœνšŒν•˜λŠ” 숫자λ₯Ό X 라고 ν•  λ•Œ, Xμ—μ„œ 두 숫자λ₯Ό λΉΌ 0이 λ˜λŠ” 경우λ₯Ό νˆ¬ν¬μΈν„° + 이뢄탐색을 톡해 μ°ΎλŠ”λ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.