sladuf
200
sladuf
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (83)
    • ๐Ÿ“š Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • ๐Ÿ“ฑ iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • ์ธ๊ฐ• & ์ฑ… (2)
    • ๐Ÿ”— Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • ๐Ÿ—‚ ETC (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • Swift
  • ์Šค์œ„ํ”„ํŠธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ธ€์“ฐ๊ธฐ ์„ค์ •
hELLO ยท Designed By ์ •์ƒ์šฐ.
sladuf

200

[Python] ๋ฐฑ์ค€ 1208
๐Ÿ”— Algorithm/Python

[Python] ๋ฐฑ์ค€ 1208

2021. 3. 8. 21:14

 

 

๊ตฌ๊ธ€๋ง์ด ์ž˜ ์•ˆ๋ผ์„œ...์ง์ ‘ ์“ฐ๋Š” ๋ฆฌ๋ทฐ ๐Ÿ˜…

 

 

 

 

1182๋ฒˆ ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ๊ณผ ๊ฐ™์€ ์œ ํ˜•์˜ ๋ฌธ์ œ์ด์ง€๋งŒ ๋ฒ”์œ„์™€ ์‹œ๊ฐ„์ œํ•œ ๋“ฑ์œผ๋กœ ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์•ผํ•œ๋‹ค.

n๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2**n ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๋Š” n==40์ด๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ 2**40์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ  ๋ฐ˜์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ์ตœ์•…์˜ ๊ฒฝ์šฐ (2**20)*2์ด๋‹ค.

(2**20)*2 = 2097152 VS 2**40 = 1099511627776 ํšจ์œจ ใ…‡ใ…ˆ?

 

๋‚˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ–ˆ๋‹ค. (์ด์œ ๋Š” ๋’ค์—)

key : ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ

value : ํ•ด๋‹น ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์ด ๋‚˜์˜จ ํšŸ์ˆ˜

 

 

์˜ˆ์ œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์ฝ”๋“œ ์„ค๋ช…์„ ํ•˜์ž๋ฉด ์šฐ์„  l=[-7,-3] r=[-2,5,8] ์ด๋‹ค.

lsum๊ณผ rsum์— ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ์ €์žฅํ•ด์ค€๋‹ค.

ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  two-pointer๋ฅผ ํ†ตํ•ด ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ• ๊ฒƒ์ด๋‹ค.

๋จผ์ € lsum๊ณผ rsum์˜ key๊ฐ’์„ sortํ•ด์„œ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.

l=0 (lsum์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ) r=len(rkey)-1 (rsum์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’๋ถ€ํ„ฐ)

โœ” ์™ผ์ชฝ+์˜ค๋ฅธ์ชฝ > s ? r-=1 ํ•ด์„œ ์ˆซ์ž๋ฅผ ์ค„์ธ๋‹ค.

โœ” ์™ผ์ชฝ+์˜ค๋ฅธ์ชฝ < s ? l+=1 ํ•ด์„œ ์ˆซ์ž๋ฅผ ํ‚ค์šด๋‹ค.

โœ” ์™ผ์ชฝ+์˜ค๋ฅธ์ชฝ == s ? ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ•ฉ์˜ ์ข…๋ฅ˜๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•œ๋‹ค. (value*value)

 

 

 

์ฒ˜์Œ์— 0์˜ value๋ฅผ 1๋กœ ์ง€์ •ํ•ด์ค€ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์ œ์—์„œ ์ฐพ๊ณ ์žํ•˜๋Š” ํ•ฉ์ด 5์ผ ๋•Œ ์›์†Œ 5๋งŒ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ 0์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์œผ๋กœ๋Š” 5๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค.

์ฆ‰, 0์€ ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์—์„œ ์•„๋ฌด ์ˆซ์ž๋„ ์„ ํƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋œปํ•œ๋‹ค.

 

๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—ด 1 1 1 1์—์„œ ํ•ฉ์ด 2๊ฐ€ ๋  ๋•Œ๋ฅผ ์ฐพ๊ณ ์ž ํ•œ๋‹ค๋ฉด

๋จผ์ € lsum=[0 1 1 2] rsum=[0 1 1 2]๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ ์ฒ˜์Œ 2๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

์ด๋•Œ l+=1ํ•  ๊ฒƒ์ธ๊ฐ€ r-=1 ํ•  ๊ฒƒ์ธ๊ฐ€?

๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ทธ๋ƒฅ counter๋ฅผ ํ†ตํ•ด ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์—†์•  ์ฃผ๊ณ ์ž ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค!

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ˜๋ก€๊ฐ€ ์žˆ๋‹ค. ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ํ•ฉ s๊ฐ€ 0์ธ ๊ฒฝ์šฐ์ด๋‹ค.

์ฒ˜์Œ l,rsum์— ์ดˆ๊ธฐํ™” ํ•ด์ค€ 0=1์€ ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‘ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‘˜ ๋‹ค ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์•ˆ๋œ๋‹ค. ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์–‘์ˆ˜๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์— s==0์ด๋ฉด res-=1์„ ํ•œ๋‹ค.

(๊ตฌํ•˜๊ณ ์žํ•˜๋Š” ํ•ฉ์ด 0์ด ์•„๋‹Œ๊ฒฝ์šฐ์—๋Š” res์— 0 0 ์ธ ๊ฒฝ์šฐ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์—†๋‹ค.)

 

 

Result

import sys
from itertools import combinations
from collections import defaultdict

n,s=map(int,sys.stdin.readline().split())
m=list(map(int, sys.stdin.readline().split()))


l=m[:n//2]
r=m[n//2:]

lsum=defaultdict(int)
rsum=defaultdict(int)
lsum[0]=1
rsum[0]=1
for i in range(1,len(l)+1):
    for com in combinations(l,i):
        lsum[sum(com)]+=1

for i in range(1,len(r)+1):
    for com in combinations(r,i):
        rsum[sum(com)]+=1

lkey=sorted(lsum.keys())
rkey=sorted(rsum.keys())

res=0
l=0
r=len(rkey)-1
while l<len(lkey) and r>=0:
    if lkey[l]+rkey[r]==s:
        res+=(lsum[lkey[l]]*rsum[rkey[r]])
        l+=1
        r-=1
    elif lkey[l]+rkey[r]>s:
        r-=1
    else:
        l+=1

if s==0:
    res-=1
print(res)

 

 

๋‚˜๋Š” ๊ฐœ๊ฐ๊ฐœ๊ฐœ๊ฐœ์–ด๋ ค์› ๋‹ค... ์ด๋ ‡๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ• ๊ฒŒ ๋งŽ์€ ๋ฌธ์ œ๋Š” ์•„์ง ๋„ˆ๋ฌด ๋ฒ„๊ฒ๋‹คใ…œใ…œ

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ”— Algorithm > Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ  (0) 2021.03.11
[Python] ๋ฐฑ์ค€ 7453  (2) 2021.03.09
[Python] ๋ฐฑ์ค€ 1167, 1967  (0) 2021.03.08
[Python] ๋ฐฑ์ค€ 10917  (0) 2021.03.07
[Python] ๋ฐฑ์ค€ 2089  (0) 2021.03.04
    '๐Ÿ”— Algorithm/Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ
    • [Python] ๋ฐฑ์ค€ 7453
    • [Python] ๋ฐฑ์ค€ 1167, 1967
    • [Python] ๋ฐฑ์ค€ 10917
    sladuf
    sladuf

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”