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๋ณด๋ค ์๋๋ก ํ์ฌ ์ ๋ ฌํ์์
Comment