๋ฌธ์

https://www.acmicpc.net/problem/10986
10986๋ฒ: ๋๋จธ์ง ํฉ
์ N๊ฐ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. ์ด๋, ์ฐ์๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ํฉ์ด M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ตฌ๊ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ฆ, Ai + ... + Aj (i ≤ j) ์ ํฉ์ด M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ (i, j)
www.acmicpc.net
์ดํด
- ๊ตฌ๊ฐ์ ํฉ์ ๊ตฌํด์ผํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๋์ ํฉ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ค.
- N์ ๋ฒ์๊ฐ 100,000์ด๋ฏ๋ก O(N)๋งํผ ํ์ฉํ ์ ์๊ณ , ํ์์ ํตํด ์ ํํด์ผ ํ๋ฏ๋ก ์ด๋ถ ํ์์ด๋ ํฌํฌ์ธํฐ๋ฅผ ํ์ฉํด์ผํ๋ค.
- ๋ฐฐ์ด ๊ฐ์ ๋ฒ์๊ฐ 1,000,000,000์ด๋ฏ๋ก ์ด๋ฅผ ๋งค๋ฒ ๋ค๋ฃจ๋ฉด ์ฐ์ฐ ์๊ฐ์ผ๋ก ์ธํด ์๊ฐ ์ด๊ณผ๊ฐ ์ผ๋ ค๋๋, M์ผ๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ ๊ฐ์ง๊ณ ํ์ฉํ๋ค. (์ต๋ 1,000,000,000 → ์ต๋ 1,000,000)
- ๋ ์ธ๋ฑ์ค๋ฅผ ๋๊ณ , ๊ฐ ์ธ๋ฑ์ค์ ๋๋จธ์ง๊ฐ์ด ๊ฐ์ผ๋ฉด ๋ ๊ฐ์ ์ฐจ์ด๋ M์ ๋ฐฐ์๊ฐ ๋๋ค.
- ์๋ฅผ๋ค์ด ๊ฐ ์ธ๋ฑ์ค ๊ฐ์ด [5, 9]๋ผ๊ณ ํ์ ๋ M = 4์ด๋ฉด, ๋๋จธ์ง๋ [1, 1]์ด๊ณ , ๋ ๊ฐ์ ์ฐจ๋ 4๋ก M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ค.
- ๋ฐ๋ผ์ ๋๋จธ์ง ๊ฐ์ด ๊ฐ์ ์ธ๋ฑ์ค ๊ฐ์๋ฅผ ์ธ๊ณ , ๊ทธ์ค 2๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์์ด๋ค.
- ๋จ, ๋๋จธ์ง๊ฐ 0์ธ ๊ฒฝ์ฐ, ์ฒซ๋ฒ์งธ๋ถํฐ์ ๋์ ํฉ์ด๋ฏ๋ก ๋ํด์ค์ผ ํจ
๊ตฌํ
- ๋์ ํฉ ๊ตฌํ๊ธฐ
for i in range(1, N): arr[i] = arr[i] + arr[i-1]โ - ๋๋จธ์ง์ ๊ฐ์ ๊ตฌํ๊ธฐ
from collections import defaultdict # define remain = defaultdict(int) # ๋๋จธ์ง์ ๊ฐ์ ์ธ๊ธฐ remain[arr[0]%M] += 1 for i in range(1, N): remain[arr[i] % M] += 1 - 2๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ
- n๊ฐ์ค k๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์กฐํฉ ์: nCk = n! / {(n-k)!k!}
- n๊ฐ์ค 2๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์กฐํฉ ์: nC2 = n(n-1) / 2
- ๋๋จธ์ง๊ฐ 0์ธ ์์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก 0๋ฒ์งธ๋ถํฐ์ ๋์ ํฉ์ด๋ฏ๋ก ๋ํด์ค์ผํจ
# ๋๋จธ์ง ๊ฐ์ ์ค 2๊ฐ ๋ฝ์์ ๋ํ๊ธฐ(์กฐํฉ) ans = remain[0] for cnt in remain.values(): ans += cnt * (cnt-1) // 2
์ฝ๋
# 10986 ๋๋จธ์ง ํฉ
import sys
from collections import defaultdict
input = sys.stdin.readline
def main():
# ์
๋ ฅ
N, M = map(int, input().split())
arr = list(map(int, input().split()))
# define
remain = defaultdict(int)
# ๋๋จธ์ง์ ๊ฐ์ ์ธ๊ธฐ
remain[arr[0]%M] += 1
for i in range(1, N):
arr[i] = arr[i] + arr[i-1]
remain[arr[i] % M] += 1
# ๋๋จธ์ง ๊ฐ์ ์ค 2๊ฐ ๋ฝ์์ ๋ํ๊ธฐ(์กฐํฉ)
ans = remain[0]
for cnt in remain.values():
ans += cnt * (cnt-1) // 2
# ์ถ๋ ฅ
print(ans)
if __name__ =="__main__":
main()
์ฐธ์กฐ
2024.04.02 - [Algorithm/๊ฐ๋ ] - [์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum)
[์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum)
๊ฐ๋ ํน์ ๋ฐฐ์ด์ด ์์ ๋, ๊ตฌ๊ฐ์ ํฉ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์์ ๋ 3๋ฒ์งธ๋ถํฐ 5๋ฒ์งธ๊น์ง์ ๋์ ํฉ์ 12์ด๋ค. ๊ตฌํ ์ผ๋ฐ์ ์ผ๋ก ๋์ ํฉ์ ๊ตฌํจ์ ์์ด, i๋ฒ์งธ๋ถํฐ j๋ฒ์งธ๊น์ง์
l1m3kun.tistory.com
๋๋์
- ๋จ์ ๋์ ํฉ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ์กฐ๊ธ ๋ ์๊ฐํ๋ฉด ์ํ์ ๋ํ ์์ฉ์ด์ฌ์ ํ ๋ฒ ๋ ์๊ฐํด์ผ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
- n๊ฐ ์ค 2๊ฐ๋ฅผ ๊ณ ๋ฅผ ๋ n*(n-1)/2 ๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์์ด ๋์ค์๋ ์์ฃผ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
- ๋ ์ฉ์ก๊ณผ ์ ์ฌํ ๋ฌธ์ ์์ง๋ง, ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ํ ์ ์์ด ์ข์ ๊ฒฝํ์ ์์๋ค.
'๐ STUDY > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค] 3 x n ํ์ผ๋ง, JavaScript ํ์ด (0) | 2026.07.22 |
|---|---|
| [์๋ฃ๊ตฌ์กฐ] ์คํ(Stack) (0) | 2026.01.16 |
| [์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum) (0) | 2024.04.02 |
| 11286. ์ ๋๊ฐ ํ (0) | 2024.03.12 |
| ํฌ๋ฃจ์ค์นผ(Kruskal) - ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) (1) | 2024.01.10 |