PS

[λ°±μ€€] 2143 두 λ°°μ—΄μ˜ ν•© with Python

ν˜•μ€€_It's 2021. 10. 12. 00:00
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 2143 두 λ°°μ—΄μ˜ ν•©

πŸ’‘ 쑰건 및 풀이

  1. (-1,000,000,000 ≀ T ≀ 1,000,000,000)
  2. (1 ≀ n ≀ 1,000)
  3. (1 ≀ m ≀ 1,000)
  4. λˆ„μ ν•© μœ ν˜•μ˜ 문제
  5. 두 λ°°μ—΄μ˜ 뢀뢄배열을 μ‚¬μš©ν•˜μ—¬ 합을 ꡬ해 Tλ₯Ό λ§Œλ“€ 수 μžˆλŠ” 개수λ₯Ό κ΅¬ν•œλ‹€.

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

from sys import stdin, setrecursionlimit

setrecursionlimit(int(1e9))

t = int(stdin.readline())
n = int(stdin.readline())
A = list(map(int, stdin.readline().split()))

m = int(stdin.readline())
B = list(map(int, stdin.readline().split()))

Asum = {}
for i in range(n):
    for j in range(i, n):
        k = sum(A[i:j + 1])
        if k in Asum:
            Asum[k] += 1
        else:
            Asum[k] = 1

Bsum = {}
for i in range(m):
    for j in range(i, m):
        k = sum(B[i:j + 1])
        if k in Bsum:
            Bsum[k] += 1
        else:
            Bsum[k] = 1

res = 0

for key in Asum.keys():
    if (t - key) in Bsum:
        res += Bsum[t - key] * Asum[key]

print(res)

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

예제

5
4
1 3 1 2
3
1 3 2

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

7

⌨️ 문제 풀이

  1. A λΆ€λΆ„ λ°°μ—΄μ˜ ν•©λ“€κ³Ό B λΆ€λΆ„ λ°°μ—΄μ˜ 합듀을 더해 Tκ°€ λ§Œλ“€μ–΄μ§€λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ˜€λ‹€.
  2. 두 배열을 각 ꡬ간에 ν•΄λ‹Ήν•˜λŠ” λˆ„μ ν•©μ„ 각각의 dict μžλ£Œκ΅¬μ‘°μ— λ„£κ³ , μ€‘λ³΅λ˜μ–΄ λ‚˜μ˜€λŠ” 경우 +1 을 ν•΄μ€€λ‹€.
  3. A λ°°μ—΄μ˜ ν‚€ 값을 순차적으둜 μˆœνšŒν•˜λ©΄μ„œ
    κ΅¬ν•˜κ³ μž ν•˜λŠ” t κ°’μ—μ„œ A λ°°μ—΄μ˜ ν‚€ 값을 λΉΌμ€€ 값이 Bλ°°μ—΄μ˜ ν‚€κ°’μœΌλ‘œ μžˆλ‹€λ©΄,
    res에 ν•΄λ‹Ή Bλ°°μ—΄μ˜ κ°’κ³Ό Aλ°°μ—΄μ˜ 값을 κ³±ν•˜μ—¬ 더해쀀닀.
    for key in Asum.keys():
     if (t - key) in Bsum:
         res += Bsum[t - key] * Asum[key]

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

  • μ²˜μŒμ— 아이디어가 λ– μ˜€λ₯΄μ§€μ•Šμ•„ νž˜λ“€μ–΄ν–ˆλ‹€.
  • μˆ˜ν•™, DPκ°€ 제일 μ•½ν•œ 것 κ°™λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.
  • Dict 자료ꡬ쑰λ₯Ό μ’‹μ•„ν•˜λŠ”λ° μ΄λ ‡κ²Œ μ‚¬μš©μ„ ν•΄λ΄μ„œ 더 μ’‹μ•˜λ‹€.
λ°˜μ‘ν˜•