우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/PYTHON

[파이썬 PYTHON] μ½”λ“œν¬μŠ€ 1426D

2023. 3. 1. 00:16
 

Problem - 1426D - Codeforces

 

codeforces.com


μˆ˜μ—΄μ΄ μ£Όμ–΄μ§€λŠ”λ°, νŠΉμ • 뢀뢄합이 0이 λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

예둜

 

1 -5 3 2

 

μœ„μ™€ 같은 μˆ˜μ—΄μ΄ μžˆμ„ λ•Œ,

 

{-5, 3, 2} 의 합은 0이 λ˜λ―€λ‘œ

 

1 -5 3 {Block} 2

μœ„ λͺ¨μ–‘ 처럼 사이λ₯Ό λŠμ–΄λ†”μ•Ό ν•˜κ³  1번으둜 μΆ©λΆ„ν•˜λ―€λ‘œ 닡은 1이닀.


 

16 -5 -11 -15 10 5 4 -4

μœ„μ˜ κ²½μš°λ„ 

16 -5 {Block} -11 -15 10 {Block} 5 4 {Block} -4

총 3λ²ˆμ„ 막아야 뢀뢄합이 0이 될 수 μ—†λ‹€.

 


이 λ¬Έμ œλŠ”, ꡬ간합 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Όν•œλ‹€.

 

 

· ꡬ간 ν•© μ•Œκ³ λ¦¬μ¦˜ (Prefix Sum Algorithm)

πŸ‘©πŸ»‍πŸ’» 지식 μ°½κ³  πŸ“š

inkyu-yoon.github.io

ꡬ간합 μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•˜λ©΄

 

λˆ„μ ν•© μˆ˜μ—΄μ„ μ΄μš©ν•΄μ„œ νŠΉμ • κ΅¬κ°„μ˜ 합을 ꡬ할 수 μžˆλ‹€.

 

λˆ„μ ν•© μˆ˜μ—΄ Sum 이 μžˆμ„ λ•Œ, μˆ˜μ—΄ Arr[a] ~ Arr[b] 의 합은

 

Sum[b]-Sum[a-1] 둜 O(1) λ³΅μž‘λ„λ‘œ ꡬ할 수 μžˆλ‹€.

 

νŠΉμ • μœ„μΉ˜(kμœ„μΉ˜)μ—μ„œ λˆ„μ ν•©μ„ κ΅¬ν–ˆλŠ”λ°, κ·Έ 값이 이미 λˆ„μ ν•© μˆ˜μ—΄μ—μ„œ 쑴재(jμœ„μΉ˜)ν•œλ‹€λ©΄

 

Sum[k]-Sum[j] = 0 이 될 수 μžˆμœΌλ―€λ‘œ 뢀뢄합이 0이 λ˜λŠ” μˆœκ°„μž„μ„ μ•Œ 수 μžˆλ‹€.

 

λ”°λΌμ„œ, λˆ„μ ν•©μ„ map의 key둜써 μ €μž₯해두고 쑰건문을 ν™œμš©ν•˜λ©΄ λœλ‹€.

 

# ꡬ간합 μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©
N = int(input())
arr = list(map(int, input().split()))

comSum = [0] * 200001
prefix_sum = {}
ans = 0

for i in range(N):
    if i == 0:
        prefix_sum[0] = "zero" # λˆ„μ ν•©μ΄ 0이 λ˜μ–΄λ„ 뢀뢄합이 0이 λ˜λŠ” μˆœκ°„μ΄λ―€λ‘œ
        prefix_sum[arr[i]] = "exist" # 첫번째 μ›μ†ŒλŠ” μ›μ†Œ 값이 λˆ„μ ν•©μ΄λ‹€.
        comSum[i] = arr[i] # 첫번째 μ›μ†ŒλŠ” μ›μ†Œ 값이 λˆ„μ ν•©μ΄λ‹€.
    else:
        sum = arr[i] + comSum[i - 1] # 직전에 μ €μž₯ν–ˆλ˜ λˆ„μ ν•© κ°’κ³Ό μ›μ†Œλ₯Ό λ”ν•˜λ©΄ λˆ„μ ν•©μ΄λ‹€.
        comSum[i] = sum # 직전에 μ €μž₯ν–ˆλ˜ λˆ„μ ν•© κ°’κ³Ό μ›μ†Œλ₯Ό λ”ν•˜λ©΄ λˆ„μ ν•©μ΄λ‹€.
        if sum in prefix_sum: # λˆ„μ ν•©μ΄ κΈ°λ‘ν•˜κ³  있던 λˆ„μ ν•© map에 μ‘΄μž¬ν•˜λŠ” 경우 뢀뢄합이 0이 λ˜λŠ” μˆœκ°„μ΄λ‹€.
            ans += 1 
            prefix_sum.clear() # λˆ„μ ν•© 기둝을 μ΄ˆκΈ°ν™” ν•œλ‹€.
            prefix_sum[0] = "zero" # λˆ„μ ν•©μ΄ 0이 λ˜μ–΄λ„ 뢀뢄합이 0이 λ˜λŠ” μˆœκ°„μ΄λ―€λ‘œ
            prefix_sum[arr[i]] = "exist" # μ΄ˆκΈ°ν™” λ˜μ—ˆμœΌλ‹ˆ, λˆ„μ ν•©μ΄ μ•„λ‹Œ μ›μ†Œ 값을 κΈ°λ‘ν•œλ‹€
            comSum[i] = arr[i] # λˆ„μ ν•©μ„ κΈ°λ‘ν•˜λ˜ 배열도 μ΄ˆκΈ°ν™” μ‹œμΌœμ€€λ‹€.
        else:
            prefix_sum[sum] = "exist" # λˆ„μ ν•© map에 λˆ„μ ν•©κ³Ό 같은 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 계속 κΈ°λ‘ν•œλ‹€.
print(ans)
    'πŸ‘¨πŸ»‍πŸ’» PS/PYTHON' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [파이썬 PYTHON] λ°±μ€€ 15686번 γ€μΉ˜ν‚¨ 배달】
    • [파이썬 PYTHON] λ°±μ€€ 15684번 【사닀리 μ‘°μž‘γ€‘
    • [파이썬 PYTHON] λ°±μ€€ 3190번 【뱀】
    • [파이썬 PYTHON] λ°±μ€€ 2812번 γ€ν¬κ²Œ λ§Œλ“€κΈ°γ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”