๐ง Prefix Sum
Prefix Sum, ๊ตฌ๊ฐํฉ, ๋์ ํฉ, ๋ถ๋ถํฉ์ด๋ผ ๋ถ๋ฆฌ๋ฉฐ ํด๋น ๊ตฌ๊ฐ์ ๋ํ ํฉ์ ๋น ๋ฅด๊ฒ ๊ตฌํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋งค์ฐ ๊ฐ๋จํ๋ค.
์๋ฆฌ๋ ์๋์ ๊ฐ๋ค.
1. ํฉ ๋ฐฐ์ด S๋ฅผ ๋ง๋๋ ๊ณต์ S[i] = S[i-1] + a[i] 2. i~j๊น์ง์ ๊ตฌ๊ฐํฉ์ ๊ตฌํ๋ ๊ณต์ S[j] - S[i-1]
์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ ๊ตฌ๊ฐ์์์ ํฉ์ ๋น ๋ฅด๊ฒ (์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ด๋ฉด์) ๊ตฌํ ์ ์๋ค.S[5] = A[0] + A[1] + A[2] + A[3] + A[4] + A[5] S[1] = A[0] + A[1] -------------------------------------------------- ∴ S[5] - S[1] = A[2] + A[3] + A[4] + A[5]
๐ง ๋ฐฑ์ค 11659 (๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ) Silver III
๐คซ solution_11659n, m = map(int, input().split()) num = list(map(int, input().split())) prefix_sum = [0] p_sum = 0 for i in num: p_sum += i prefix_sum.append(p_sum) for _ in range(m): i, j = map(int, input().split()) print(prefix_sum[j] - prefix_sum[i-1])
๐ง ๋ฐฑ์ค 11660(๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ _ ์ด์ฐจ์ ๋ฐฐ์ด) Silver I
๐คซ Algorithm
๐คซ solution_11660n, m = map(int, input().split()) num = [list(map(int, input().split())) for i in range(n)] S = [[0 for i in range(n + 1)] for i in range(n + 1)] for i in range(n): for j in range(n): S[i + 1][j + 1] = (S[i][j + 1] + S[i + 1][j] - S[i][j]) + num[i][j] for i in range(m): x1, y1, x2, y2 = map(int, input().split()) print(S[x2][y2] - (S[x2][y1-1] + S[x1-1][y2]) + S[x1-1][y1-1])
๐ง ๋ฐฑ์ค 10986(๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ) Gold III
๋ถ๋ถ ํฉ ๊ฐ๋ ์ ์ด์ฉํด์ ํ ๋, ๋ถ๋ถ ํฉ์ ๊ณ์ฐํ ๋ฐฐ์ด์ i, j๋ก ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ๊ฒฝ์ฐ O(n^2)์ผ๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋ค๋ฅธ ํ์ด ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
๐คซ Algorithm
๋ฏธ๋ฆฌ ๊ตฌํด๋ prefix sum์์์ ๋ถ๋ถํฉ์ S[j] - S[i - 1]์ ๊ณผ์ ์ด๋ค. ์ด๋, S[j]์ S[i-1]์ด ๊ฐ๊ฐ m์ผ๋ก ๋๋ด์ ๋์ ๋๋จธ์ง๊ฐ ๋์ผํ๋ค๋ฉด? S[j] - S[i - 1] ์ฐ์ฐ ํ ๋๋จธ์ง๋ 0์ด ๋๊ธฐ์ m์ผ๋ก ๋๋ ๋จ์ด์ง๋ค. ๊ฒฐ๊ตญ m์ผ๋ก ๋๋ ๋จ์ด์ง๋ ๋ถ๋ถํฉ์ ๊ตฌํ๋ ๊ฒ์ ๋๋จธ์ง๊ฐ ๋์ผํ idx ์ค ์์๋ก nC2๋ฅผ ์ ํํ๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ๋ค์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ์น๋ค. [1] [2] [3] [1] [2] -> [0] [1] [3] [6] [7] [9] -> [0] [1] [0] [0] [1] [0] -> [0 : 4, 1 : 2] -> 6 + 1 -> 7
๐คซ solution_10986import sys input = sys.stdin.readline n, m = map(int, input().split()) num_list = list(map(int, input().split())) rest_list = [0 for _ in range(m)] rest_list[0] = 1 prefix_sum = 0 for i in range(n): prefix_sum += num_list[i] rest = prefix_sum % m # ๋๋จธ์ง ๊ฐ์ ๋ฐ๋ผ์ idx ์ ๋ณด ์ ์ฅ rest_list[rest] += 1 cnt = 0 for i in rest_list: cnt += i*(i - 1) // 2 print(cnt)