[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κ° λλλ‘ λ§λ€μλ€.
-
λ€μκ³Ό κ°μ΄ std_inμμ 첫λ²μ§Έ μμλ₯Ό λ°μμ€κ³ dic_inμ keyκ°μ μλμ§ νμΈνλ€.
(μμμ dic_inμ μ λ ¬νμ§ μμλ€λ©΄ 3=>0μ μ°Ύμ μ μμμ μλ μμ)
첫λ²μ§Έ νμμ λΆλ¬μ΄
-
μλ€λ©΄
μΉκ΅¬κ° μλ€λ©΄
-
dic_inμμ ν΄λΉ key κ°κ³Ό μ°κ²°λ value κ°λ€μ forλ¬ΈμΌλ‘ λ°μμ¨λ€.
μΉκ΅¬λ€μ λΆλ¬μ¨λ€.
-
ν΄λΉ key, value λͺ¨λκ° std_inμμ μ‘΄μ¬νλ€λ©΄ std_inμμ μμ
μΉκ΅¬κ΄κ³κ° μκ³ , μμ§ μ§μ΄ λ§Ίμ΄μ§μ§ μμλ€λ©΄ μ§μ λ§Ίμ΄μ£ΌκΈ°
-
std_inμ κΈΈμ΄κ° 0μ΄λ©΄ κ²½μ°μ μμ 1 λνκΈ°
μ§μ§κΈ°κ° λλ¬μΌλ©΄ κ²½μ°μ μ νλμ ν΄λΉ
-
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
μ£Όμ΄μ§ λ΅κ³Ό λ€λ₯Έ μ
-
μ£Όμ΄μ§ λ΅μ 'μ§μ μ°Ύμλμ§', 'μΉκ΅¬μΈμ§'μ μ¬λΆλ₯Ό μ§κ΄μ μΌλ‘ μκΈ° μ½κ² λ°°μ΄λ‘ νννμλ€. νμ§λ§ μ΄λ μΈλͺ¨μλ κ°λ€λ λ§μ΄ λ΄κ³ μμΌλ―λ‘ λ©λͺ¨λ¦¬ λλΉλ‘ λ³Ό μλ μλ€. (μλ£κ΅¬μ‘° μ°¨μ΄)
λ³ΈμΈμ 'μ§μ μ°Ύμλμ§'λ listμΈ studentλ‘ νννκ³ 'μΉκ΅¬μΈμ§'λ dictionaryμΈ partner_dicλ‘ νννμλ€. μ΄λ 보기μ λ©λͺ¨λ¦¬λ₯Ό μ μ½ν κ²μ²λΌ 보μ΄μ§λ§ λ°λ³΅λ¬Έμ λ λλ§λ€ deepcopyλ₯Ό μΌμ΄μΌνμΌλ―λ‘ μ μ½νλ€κ³ λ³Ό μλ μλ€.
-
κ²½μ°μ μ μΈ‘μ ν, μλ λ°°μ΄λ‘ λλ € λκΈ°
taken[firstFree] = taken[pairWith] = true; ret += countPairings(taken); taken[firstFree] = taken[pairWith] = false;
λ³ΈμΈμ stdμ μμλ₯Ό μ§μ λ€κ° λλ €λλ κ² λμ μ, copy λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ deepcopyλ‘ λ°°μ΄λ€μ 볡μ¬ν΄μ μ¬μ©νμλ€. λ°λΌμ λλ € λμ νμκ° μμλ€.
-
return κ°μ μ΄μ©
κ²°κ΅ λ§μ§λ§μ retμ΄λΌλ κ°μ returnνμ¬ λ¬Έμ μ λ΅μ μΆλ ₯ν¨
λ³ΈμΈμ μΈλΆ λ³μμ λνλ μμΌλ‘ ꡬννμμ
μ μ’μ λ°©λ²μΈλ―ν¨! (κ³ μΉκΈ°)
-
μ€λ³΅μ μ κ±°νκΈ° μν΄ λ¨μ νμλ€ μ€ λΉ λ₯Έ λ²νΈλ₯Ό λΆλ¬μ€λ λ°©μμ μ¬μ©
λ³ΈμΈμ μ€λ³΅μ μ κ±°νκΈ° μν΄ μΉκ΅¬ κ΄κ³λ₯Ό νννλ dictionaryλ₯Ό keyκ° valueλ³΄λ€ μλλ‘ νμ¬ μ λ ¬νμμ