[python] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: ์†Œํ’ (p155) ๋ฌธ์ œ

6.3 ๋ฌธ์ œ: ์†Œํ’ (๋ฌธ์ œ ID: PICNIC, ๋‚œ์ด๋„: ํ•˜)

๋ฌธ์ œ

์•ˆ๋“œ๋กœ๋ฉ”๋‹ค ์œ ์น˜์› ์ต์Šคํ”„๋ ˆ์Šค๋ฐ˜์—์„œ๋Š” ๋‹ค์Œ ์ฃผ์— ์œจ๋™๊ณต์›์œผ๋กœ ์†Œํ’์„ ๊ฐ‘๋‹ˆ๋‹ค. ์›์„ ์„ ์ƒ๋‹˜์€ ์†Œํ’ ๋•Œ ํ•™์ƒ๋“ค์„ ๋‘ ๋ช…์”ฉ ์ง์„ ์ง€์–ด ํ–‰๋™ํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์„œ๋กœ ์นœ๊ตฌ๊ฐ€ ์•„๋‹Œ ํ•™์ƒ๋“ค๋ผ๋ฆฌ ์ง์„ ์ง€์–ด ์ฃผ๋ฉด ์„œ๋กœ ์‹ธ์šฐ๊ฑฐ๋‚˜ ๊ฐ™์ด ๋Œ์•„๋‹ค๋‹ˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ ์„œ๋กœ ์นœ๊ตฌ์ธ ํ•™์ƒ๋“ค๋ผ๋ฆฌ๋งŒ ์ง์„ ์ง€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํ•™์ƒ๋“ค์˜ ์Œ์— ๋Œ€ํ•ด ์ด๋“ค์ด ์„œ๋กœ ์นœ๊ตฌ์ธ์ง€ ์—ฌ๋ถ€๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ํ•™์ƒ๋“ค์„ ์ง ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”. ์ง์ด ๋˜๋Š” ํ•™์ƒ๋“ค์ด ์ผ๋ถ€๋งŒ ๋‹ค๋ฅด๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • (ํƒœ์—ฐ,์ œ์‹œ์นด)(์จ๋‹ˆ,ํ‹ฐํŒŒ๋‹ˆ)(ํšจ์—ฐ,์œ ๋ฆฌ)
  • (ํƒœ์—ฐ,์ œ์‹œ์นด)(์จ๋‹ˆ,์œ ๋ฆฌ)(ํšจ์—ฐ, ํ‹ฐํŒŒ๋‹ˆ)

์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

ํ”„๋กœ๊ทธ๋žจ์€ 1์ดˆ ๋‚ด์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ณ , 64MB ์ดํ•˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜ C(C<=50)๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ํ•™์ƒ์˜ ์ˆ˜ n(2<=n<=10)๊ณผ ์นœ๊ตฌ ์Œ์˜ ์ˆ˜ m(0<=m<n*(n-1)/2)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์— m๊ฐœ์˜ ์ •์ˆ˜ ์Œ์œผ๋กœ ์„œ๋กœ ์นœ๊ตฌ์ธ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๋Š” ๋ชจ๋‘ 0๋ถ€ํ„ฐ n-1 ์‚ฌ์ด์˜ ์ •์ˆ˜์ด๊ณ , ๊ฐ™์€ ์Œ์€ ์ž…๋ ฅ์— ๋‘ ๋ฒˆ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•™์ƒ๋“ค์˜ ์ˆ˜๋Š” ์ง์ˆ˜์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„์— ๋ชจ๋“  ํ•™์ƒ์„ ์นœ๊ตฌ๋ผ๋ฆฌ๋งŒ ์ง์ง€์–ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์˜ ๋‹ต

import sys
import copy

test_case=int(input())
result = list()

def makePartner(std_in,dic_in,c):
    first_std = str(std_in[0])
    if first_std in dic_in:
        for value in dic_in[first_std]:
            std = copy.deepcopy(std_in)
            dic = copy.deepcopy(dic_in)
            if int(value) in std:
                del std[0]
                std.remove(int(value))
            else:
                continue
            if not(len(std)):
                result[c]+=1
            else:
                makePartner(std,dic,c)
    else:
        result[c]=0

for case in range(0,test_case):
    try:
        n_m = ""
        partner = ""
        n_m=input()
        partner = input()

        tmp_index= int()
        partner_dic = dict()

    except:
        print("input error")
        sys.exit()

    # make n, m
    for i in range(0,len(n_m)):
        if n_m[i]==" ":
            tmp_index = i

    n = int(n_m[:tmp_index])
    m = int(n_m[tmp_index:])

    # make student list
    student = list()
    for i in range(0,n):
        student.append(i)

    # make partner dictionary
    i=1
    while len(partner):
        if partner[i]==" ":
            key= partner[i-1]
            value = partner[i+1]
            partner= partner[i+3:]
            i=1
            if key>value:
                tmp = key
                key = value
                value = tmp
            if not(key in partner_dic):
                partner_dic[key]=list()
            partner_dic[key].append(value)
        else:
            i+=1

    check_bool = test_case>50 or n<2 or n>10 or m<0 or m>n*(n-1)/2
    if check_bool :
        print("input bool error")
        sys.exit()

    result.append(0)
    makePartner(student,partner_dic,case)

for i in result:
    print(i)
์„ค๋ช…

std_in, ์ฆ‰ student list๋Š” ํ˜„์žฌ ์ง์ด ๋˜์ง€ ๋ชปํ•œ ํ•™์ƒ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

dic_in, ์ฆ‰ partner_dic dictionary๋Š” ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด key ๊ฐ’์ด value ๊ฐ’๋ณด๋‹ค ์ž‘๊ฒŒ ์ •๋ ฌํ•˜์—ฌ, a=>b๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด std_in์—์„œ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  dic_in์˜ key๊ฐ’์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    (์œ„์—์„œ dic_in์„ ์ •๋ ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 3=>0์€ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์„ ์ˆ˜๋„ ์žˆ์Œ)

    ์ฒซ๋ฒˆ์งธ ํ•™์ƒ์„ ๋ถˆ๋Ÿฌ์˜ด

  2. ์žˆ๋‹ค๋ฉด

    ์นœ๊ตฌ๊ฐ€ ์žˆ๋‹ค๋ฉด

  3. dic_in์—์„œ ํ•ด๋‹น key ๊ฐ’๊ณผ ์—ฐ๊ฒฐ๋œ value ๊ฐ’๋“ค์„ for๋ฌธ์œผ๋กœ ๋ฐ›์•„์˜จ๋‹ค.

    ์นœ๊ตฌ๋“ค์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

  4. ํ•ด๋‹น key, value ๋ชจ๋‘๊ฐ€ std_in์—์„œ ์กด์žฌํ•œ๋‹ค๋ฉด std_in์—์„œ ์‚ญ์ œ

    ์นœ๊ตฌ๊ด€๊ณ„๊ฐ€ ์žˆ๊ณ , ์•„์ง ์ง์ด ๋งบ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ์ง์„ ๋งบ์–ด์ฃผ๊ธฐ

  5. std_in์˜ ๊ธธ์ด๊ฐ€ 0์ด๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜์— 1 ๋”ํ•˜๊ธฐ

    ์ง์ง“๊ธฐ๊ฐ€ ๋๋‚ฌ์œผ๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜ ํ•˜๋‚˜์— ํ•ด๋‹น

  6. std_in์ด ๋‚จ์•„์žˆ์œผ๋ฉด ๋‚จ์•„์žˆ๋Š” std_in์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ›์•„์™€์„œ 1๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ˜๋ณต

    ์•„์ง ์•ˆ ๋๋‚ฌ์œผ๋ฉด ๋‚จ์•„์žˆ๋Š” ํ•™์ƒ์˜ ์ง์„ ์ฐพ์•„์ฃผ๊ธฐ

์‹œ๊ฐ„ ๋ณต์žก๋„

์ตœ์•…์œผ๋กœ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ, N์ด ์ตœ๋Œ“๊ฐ’ 10์ด๊ณ  M์ด 45๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ํ•™์ƒ๋“ค์ด ๋ชจ๋‘ ์ง์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ๋ฉด, 9*7*5*3*1 = 945์ด ๋‚˜์˜ค๋ฏ€๋กœ ์ตœ๋Œ€ 945์˜ ๋ณต์žก๋„๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ

๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ฝ 10MB ์‚ฌ์šฉํ•˜์˜€์Œ

Partition of a set of 140543 objects. Total size = 10,296,461 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 45995 33 3303978 32 3303978 32 str
1 34802 25 1466880 14 4770858 46 tuple
2 17277 12 1025011 10 5795869 56 bytes
3 8665 6 729928 7 6525797 63 types.CodeType
4 1395 1 670536 7 7196333 70 type
5 8042 6 579024 6 7775357 76 function
6 2116 2 506052 5 8281409 80 dict (no owner)
7 1395 1 405012 4 8686421 84 dict of type
8 361 0 291624 3 8978045 87 dict of module
9 367 0 149324 1 9127369 89 set
<381 more rows. Type e.g. '_.more' to view.>

 

python ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •๋ฒ• : http://egloos.zum.com/mcchae/v/11174965

์ฃผ์–ด์ง„ ๋‹ต๊ณผ ๋‹ค๋ฅธ ์ 
  1. ์ฃผ์–ด์ง„ ๋‹ต์€ '์ง์„ ์ฐพ์•˜๋Š”์ง€', '์นœ๊ตฌ์ธ์ง€'์˜ ์—ฌ๋ถ€๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์“ธ๋ชจ์—†๋Š” ๊ฐ’๋“ค๋„ ๋งŽ์ด ๋‹ด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. (์ž๋ฃŒ๊ตฌ์กฐ ์ฐจ์ด)

    ๋ณธ์ธ์€ '์ง์„ ์ฐพ์•˜๋Š”์ง€'๋Š” list์ธ student๋กœ ํ‘œํ˜„ํ•˜๊ณ  '์นœ๊ตฌ์ธ์ง€'๋Š” dictionary์ธ partner_dic๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค. ์ด๋Š” ๋ณด๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ ๋•Œ๋งˆ๋‹ค deepcopy๋ฅผ ์ผ์–ด์•ผํ–ˆ์œผ๋ฏ€๋กœ ์ ˆ์•ฝํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์—†๋‹ค.

  2. ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ธก์ • ํ›„, ์›๋ž˜ ๋ฐฐ์—ด๋กœ ๋Œ๋ ค ๋†“๊ธฐ

    taken[firstFree] = taken[pairWith] = true;
    ret += countPairings(taken);
    taken[firstFree] = taken[pairWith] = false;

    ๋ณธ์ธ์€ std์˜ ์š”์†Œ๋ฅผ ์ง€์› ๋‹ค๊ฐ€ ๋Œ๋ ค๋†“๋Š” ๊ฒƒ ๋Œ€์‹ ์—, copy ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ deepcopy๋กœ ๋ฐฐ์—ด๋“ค์„ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ๋ ค ๋†“์„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

  3. return ๊ฐ’์„ ์ด์šฉ

    ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰์— ret์ด๋ผ๋Š” ๊ฐ’์„ returnํ•˜์—ฌ ๋ฌธ์ œ์˜ ๋‹ต์„ ์ถœ๋ ฅํ•จ

    ๋ณธ์ธ์€ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ๋”ํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Œ

    ์•ˆ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ๋“ฏํ•จ! (๊ณ ์น˜๊ธฐ)

  4. ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚จ์€ ํ•™์ƒ๋“ค ์ค‘ ๋น ๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉ

    ๋ณธ์ธ์€ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” dictionary๋ฅผ key๊ฐ€ value๋ณด๋‹ค ์ž‘๋„๋ก ํ•˜์—ฌ ์ •๋ ฌํ•˜์˜€์Œ

๋ฐ˜์‘ํ˜•