6.5 ๋ฌธ์ : ๊ฒ์ํ ๋ฎ๊ธฐ (๋ฌธ์ ID: BOARDCOVER, ๋์ด๋: ํ)
๋ฌธ์
H X W ํฌ๊ธฐ์ ๊ฒ์ํ์ด ์์ต๋๋ค. ๊ฒ์ํ์ ๊ฒ์ ์นธ๊ณผ ํฐ ์นธ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฉ์ ๋ชจ์์ ํ๊ณ ์๋๋ฐ ์ด ์ค ๋ชจ๋ ํฐ ์นธ์ ์ธ ์นธ์ง๋ฆฌ L์ ๋ชจ์์ ๋ธ๋ก์ผ๋ก ๋ฎ๊ณ ์ถ์ต๋๋ค. ์ด๋ ๋ธ๋ก๋ค์ ์์ ๋กญ๊ฒ ํ์ ํด์ ๋์ ์ ์์ง๋ง, ์๋ก ๊ฒน์น๊ฑฐ๋, ๊ฒ์ ์นธ์ ๋ฎ๊ฑฐ๋, ๊ฒ์ํ ๋ฐ์ผ๋ก ๋๊ฐ์๋ ์ ๋ฉ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์ ํ ๊ฒ์ํ๊ณผ ์ด๋ฅผ ๋ฎ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ฒ์ํ์ด ์ฃผ์ด์ง ๋ ์ด๋ฅผ ๋ฎ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ ํ
ํ๋ก๊ทธ๋จ์ 2์ด ์์ ์คํ๋์ด์ผ ํ๋ฉฐ, 64MB ์ดํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ๋ง ํฉ๋๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C(C<=30)๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ๋ ๊ฐ์ ์ ์ H,W(1<=H,W<=20)๊ฐ ์ฃผ์ด์ง๋๋ค. ๋ค์ H ์ค์ ๊ฐ W ๊ธ์๋ก ๊ฒ์ํ์ ๋ชจ์์ด ์ฃผ์ด์ง๋๋ค. #์ ๊ฒ์ ์นธ, .์ ํฐ ์นธ์ ๋ํ๋ ๋๋ค. ์ ๋ ฅ์ ์ฃผ์ด์ง๋ ๊ฒ์ํ์ ์๋ ํฐ ์นธ์ ์๋ 50์ ๋์ง ์์ต๋๋ค.
์ถ๋ ฅ
ํ ์ค์ ํ๋์ฉ ํฐ ์นธ์ ๋ชจ๋ ๋ฎ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๋์ ๋ต
import sys
import copy
try:
c=int(input()) # testcase
h_w=input()
blank = int()
for index in range(0,len(h_w)):
if h_w[index]==" ":
blank = index
h = int(h_w[:blank])
w = int(h_w[blank+1:])
row = list()
for i in range(0,h):
row.append(input())
array = list()
white_sum = int(0)
net=int(0)
for i in range(0,h):
array.append(list())
for j in range(0,w):
array[i].append(row[i][j])
if row[i][j]==".":
white_sum+=1
if c>30 or h<1 or h>20 or w<1 or w>20 or white_sum>50:
raise Exception("range error")
except:
print("input sys error")
sys.exit()
def findL(place,tmp_array,map,L):
tmp_array.append(place)
if len(tmp_array)==3:
tmp = copy.deepcopy(tmp_array)
L.append(tmp)
tmp_array.pop()
return
direction = [[0,1],[1,0],[-1,0],[0,-1]]
for dir in direction: # ์ฌ๊ธฐ์๋ถํฐ
tmp=[]
for i in range(0,2):
tmp.append(dir[i]+place[i])
if tmp[0]>=0 and tmp[0]<h and tmp[1]>=0 and tmp[1]<w and not(tmp in tmp_array) and map[tmp[0]][tmp[1]]==".":
if len(tmp_array)==2:
x1 = tmp_array[0][0]
y1 = tmp_array[0][1]
x2 = tmp_array[1][0]
y2 = tmp_array[1][1]
if (x1==x2 and x2==tmp[0]) or (y1==y2 and y2==tmp[1]) or (x1!=x2!=tmp[0]) or (y1!=y2!=tmp[1]): # L๋ชจ์์ธ์ง ์ฒดํฌ
continue
findL(tmp,tmp_array,map,L)
tmp_array.pop()
def findL_two(place,map,L):
direction = [[0,1],[1,0],[0,-1],[-1,0]]
for index in range(0,len(direction)):
x1 = direction[index][0]+place[0]
y1 = direction[index][1]+place[1]
if index==3:
x2 = direction[0][0]+place[0]
y2 = direction[0][1]+place[1]
else:
x2 = direction[index+1][0]+place[0]
y2 = direction[index+1][1]+place[1]
if x1>=0 and x1<=h and y1>=0 and y1<=w and x2>=0 and x2<=h and y2>=0 and y2<=w and map[x1][y1]=="." and map[x2][y2]==".":
array = list()
array.append(place)
array.append([x1,y1])
array.append([x2,y2])
L.append(array)
def completeMap(map):
first_white = list()
global net
global white_sum
tmp = True
for j in range(0,h):
for i in range(0,w):
if map[j][i]==".":
tmp = False
first_white.append(j)
first_white.append(i)
break
if not(tmp):
break
L = list()
array = list()
print(first_white)
findL(first_white,array,map,L)
findL_two(first_white,map,L)
print(L)
if not(len(L)):
return 0
for l_obj in L:
for lxy in l_obj:
map[lxy[0]][lxy[1]]="*"
white_sum-=1
print(white_sum)
print("map1")
for tmp in map:
print(tmp)
if not(white_sum):
for lxy in l_obj:
map[lxy[0]][lxy[1]]="."
white_sum+=1
return 1
else:
done = int(completeMap(map))
net += done
done = 0
for lxy in l_obj:
map[lxy[0]][lxy[1]]="."
white_sum+=1
print(white_sum)
print("map2")
for tmp in map:
print(tmp)
print("net",net)
return 0
if not(white_sum%3):
completeMap(array)
print("net", net)
else: # ์ฃผ์ด์ง ํฐ์นธ์ด 3์ ๋ฐฐ์๊ฐ ์๋๋ฉด fail
print(0)
sys.exit()
์ค๋ช
โ completeMap ํจ์๋ ์ฐ์ map์ด ์ฃผ์ด์ก์ ๋ ๊ฐ์ฅ ์ฒ์ ๋ฐ๊ฒฌ๋ ํฐ ์นธ๋ถํฐ ์์ํด์ ํด๋น ์นธ์ ์ง๋๋ L๋ชจ์์ ์ฐพ๋๋ค. L๋ชจ์ ์ฐพ๊ธฐ๋ ํจ์ 2๊ฐ๋ก ๊ตฌํํ์์ผ๋ฉฐ, ์ฒซ๋ฒ์งธ ํจ์๋ ํด๋น ์นธ์์ ์์๋๋ L๋ชจ์์ด๊ณ ๋๋ฒ์งธ ํจ์๋ ํด๋น ์นธ์ ๊ฐ์ด๋ฐ๋ก ํ๋ L๋ชจ์์ด๋ค.
์ผ์ชฝ๊ณผ ๊ฐ์ map์ด ์ฃผ์ด์ก์ ๋, ์์ ์์น๋ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์ผ์ชฝ ์๋จ์ ์นธ์ด๊ณ , ํด๋น ์นธ์ ํฌํจํ๋ L๋ชจ์์ findL, findL_two ํจ์๋ฅผ ํตํด ๋ชจ๋ ์ฐพ์ผ๋ฉด ๋ค์ ์ธ๊ฐ์ง๊ฐ ๋์จ๋ค.
์ฐพ์ L๋ชจ์ 3๊ฐ์ง๋ฅผ for๋ฌธ์ ํตํด ์ฐจ๋ก๋ก ํ๋์ฉ map์ ์ฑ์ฐ๋ฉด์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด completeMap์ ๋ฐ๋ map์ ๋๊ธด๋ค.
์ผ์ชฝ๊ณผ ๊ฐ์ ๋ฐ๋ map์์ ์์ ์์น๋ฅผ ์ก๊ณ ๋ฐฉ๊ธ ์ ๊ณผ ๊ฐ์ด L๋ชจ์์ ๋ชจ๋ ์ฐพ์ ๋ค์ for๋ฌธ์ ๋๋ฉด์ ํ๋์ฉ ๋ฃ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ map์ด ๋์ค๋๋ฐ, ํ๋ฒ ๋ ์ฌ๊ทํจ์๋ฅผ ํตํด ๋๊ธฐ๊ฒ ๋๋ฉด ํด๋น ์์น์์์ L๋ชจ์์ ์ฐพ์ ์ ์๊ณ , ๊ทธ๋ ๋ค๋ฉด ์คํจ๋ก 0๊ฐ์ return ํ๋ค.
0์ return ๋ฐ๊ณ map์์ ์ฑ์ ๋ ๋ถ๋ถ์ ์ญ์ ํ ํ, 2๋ฒ์งธ ๊ทธ๋ฆผ์์์ for๋ฌธ์ ๊ณ์ ์งํํ์ฌ ๋ค๋ฅธ L ๋ชจ์์ ๋ฃ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ณ์ ์งํํ๋ค๊ฐ map์ด ์์ ํ ์ฑ์์ง๋ ๋์ ์ ์ญ๋ณ์ net์ 1 ์ฆ๊ฐ ์ํจ๋ค.
๋ฌธ์ ์
์์ ํ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ณด์๋๋ฐ, ์๊ฐ๋ณด๋ค ์ฝ๋ ์ง๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ ๋ค. ์์ง ์ฌ๊ทํจ์์์ return ํ๋ ๋ถ๋ถ์ด๋ ์ ์ญ ๋ณ์์ ๊ฐ์ ๋ํ๋ ๋ถ๋ถ์ ์ ๋๋ก ๊นจ๋ซ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๊ณ๋ฅผ ๋์ถฉํ๊ณ ์์ํ๋ค๋ณด๋ ๊ตฌํ ์ ๊ณ ์ณ์ผ ํ ์ฌํญ๋ค์ด ๋ง์์ ๋๋ฒ๊น ํด๋ณด๋ฉด์ ๊ณ ์น๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ฒ ๋์ด ํธ๋๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
๋ํ ์์ ํ์์ด๋ค ๋ณด๋ ์๊ฐ์ด ๋๋ฌด ๋ง์ด ๊ฑธ๋ ค 1514์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๋ ๋ง์ง๋ง ์์ ์ ๊ฒฝ์ฐ 10๋ถ ๋์ ํ๋ก๊ทธ๋จ์ ๊ฐ๋์์ผ์ผ ๋ต์ด ๋์๋ค. ๋ต์ ์ ํํ ๋์์ง๋ง ๋๋ฌด ์ค๋ ๊ฑธ๋ ค ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๊ฐ ๋ณต์ก๋
์ต์ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์๊ฐํด๋ณด๋ฉด ํ ์นธ์ ๋์ฌ ์ ์๋ L๋ชจ์์ ์ต๋ 12๊ฐ์ด๋ค. map์์ ๋ฒ์ด๋๊ฑฐ๋ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ ์ธํ ๊ฐ์ด๋ฐ์ ํฐ ์นธ์์๋ง ์งํํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ํฐ ์นธ์ด ์ต๋ 50์นธ ๋์ฌ ์ ์์ผ๋ฏ๋ก 88 map์ผ๋ ์ต๋ 42์นธ ์ ๋๋ก ๊ณ์ฐํ๋ฉด ๋๋ค. testcase๋ ์ต๋ 50๋ฒ ์คํํ ์ ์์ผ๋ฏ๋ก, 12^(42)*50 ์ด ์ต์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ ๋๋ฉฐ, ๋๋ฌด ํฌ๋ค.
๋ฉ๋ชจ๋ฆฌ
Partition of a set of 140556 objects. Total size = 10300278 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 45997 33 3304049 32 3304049 32 str
1 34808 25 1467312 14 4771361 46 tuple
2 17281 12 1026153 10 5797514 56 bytes
3 8667 6 730096 7 6527610 63 types.CodeType
4 1395 1 670536 7 7198146 70 type
5 8044 6 579168 6 7777314 76 function
6 2115 2 505916 5 8283230 80 dict (no owner)
7 1395 1 405012 4 8688242 84 dict of type
8 361 0 291624 3 8979866 87 dict of module
9 367 0 150860 1 9130726 89 set
<381 more rows. Type e.g. '_.more' to view.>
testcase 3๊ฐ๋ ๋๋ฌด ์๊ฐ์ด ์ค๋๊ฑธ๋ ค์ (๋ง์ง๋ง testcase๊ฐ) 2๋ฒ์งธ ๊ฒ๋ง ๋๋ ค๋ดฃ๋๋ฐ 10GB ์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์๋ค. ๋ง์ง๋ง testcase๋ ํจ์ฌ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ฃผ์ด์ง ๋ต๊ณผ ๋ค๋ฅธ ์
โ ์ผ์ชฝ ์๋ถํฐ๋ก ์์๋ฅผ ๊ฐ์ ํ์ฌ ๊ตฌํํ๋ ๊ฒ์ ๊ฐ์์ผ๋, ๋ณธ์ธ์ ํ์ฌ ์นธ์ ํฌํจํ๋ L๋ชจ์์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํ๋ค. ๋ฐ๋ผ์ ํ ์นธ ๋น 12๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ํ์ํ๋ค. ์ฌ์ง์ด ์ฒ์์๋ findL(8๊ฐ), findL_two(4๊ฐ) ๋๊ฐ์ ํจ์๋ก ๋๋์ด์ ๊ตฌํ๋๋ฐ, ์๋ชป๋จ์ ๊นจ๋ซ๊ณ ๊ณ ์น๊ธดํ๋ค.
โ ๊ณ ์น ์ฝ๋๋ direction์์ ์ ์ด์ ํด๋นํ์ง ์๋ ๋ถ๋ถ(*์ด๊ฑฐ๋ map์์ ๋ฒ์ด๋๊ฑฐ๋)๋ค์ ์ง์ฐ๋ ๋ฐฉ์์ผ๋ก ์งํํ์์ผ๋, ์ด์ ์ฝ๋์ ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ๋๋ค.
โ ์ฃผ์ด์ง ๋ต์์๋ ์ผ์ชฝ ์๋ถํฐ๋ผ๋ ์์๋ฅผ ๊ฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ง ๋์จ๋ค๊ณ ์ค๋ช ํ๊ณ ์๋ค.
์๋๋ ์ค๊ฐ ์นธ์ ์๊ฐํด์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ์ ธ์ผํ๋ค๊ณ ์๊ฐํ์ผ๋, ์ผ์ชฝ ์๋ถํฐ ์ฑ์ ๋๊ฐ๋ฉด ์ด์ฐจํผ ๋๊ฐ์ ์กฐ๊ฑด์ด ๋๋ฏ๋ก 4๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ง ๋ฐ์ง๋ฉด ๋๋ค.
โ ์ด๋ ๊ฒ L๋ชจ์ ์ฐพ๊ธฐ์์ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ฝ๋๋ฅผ ํ๋ฒ์ 4๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ง ๋ฐ์ง๋ฉด ๋๋ ์ฝ๋๋ก ๋ณํํ๋ค๋ฉด ๋ณต์ก๋๊ฐ ๋ํญ ๊ฐ์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
โ ๋ํ L ๋ชจ์ ํ๋๋ฅผ ์ฐพ๋๋ค๋ ๊ฒ์ ํ ์กฐ๊ฐ์ผ๋ก ๋ณด๋ ๋ฐ์๋ ์ฑ๊ณตํ์ง๋ง, ์ ์ฒด L๋ชจ์์ ๊ฐฏ์๋ฅผ N์ผ๋ก ์ทจ๊ธํ์ฌ N๊ฐ์ ์กฐ๊ฐ์ด ์ ์ฒด๋ฅผ ์์ฑํ๋ค๋ ์๊ฐ์ ํ์ง ๋ชปํ๊ณ ์ฝ๋๋ฅผ ์งฐ๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ตฌํ๋ ๋ฐฉ์๋ ์์ ํด์ผํ ๊ฒ์ด๋ค.
โ ์ฃผ์ด์ง ๋ต์์๋ 4๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์ต๋ [50/3] = 16๊ฐ์ ๋ธ๋ก๋ง๋ค ์กด์ฌํ๊ธฐ ๋๋ฌธ์ 4์ 16์น ์ฆ, 2์ 32๊ฐ๋ฅผ ๋ต์ ์ํ์ผ๋ก ๊ณ์ฐํ์๋ค.
โ ๋ณธ์ธ์ ํฐ ์นธ์ด ์์ด์ง๋ ๊ฒฝ์ฐ(map์ด ๋ชจ๋ ๋ฎํ๋ ๊ฒฝ์ฐ)๋ฅผ white_sum์ด๋ผ๋ ๋ณ์๋ฅผ ๋์ด ๊ณ์ ๋ณ๊ฒฝ์ํค๋ ์ฝ๋๋ก ๊ตฌํํ๋ค.
โ ์ฃผ์ด์ง ๋ต์์๋ ์ฒ์์ ์ผ์ชฝ ์๋จ์ ํฐ ์นธ์ ์ฐพ๋ ๊ณผ์ ์์ ํฐ ์นธ์ ์ฐพ์ ์ ์์ผ๋ฉด map์ด ์์ฑ๋์๋ค๊ณ ํ๋จํ๊ฒ ๊ตฌํํ๋ค. ํ๋์ ์ํฉ์ ๋ ๊ฐ์ง ๋ณ์๋ก ๋๋์ด ๋ํ๋ด๋ ๊ฒ๋ณด๋ค ์ด์ ๊ฐ์ ๋ฐฉ์์ด ๋ ์ ํํ ๊ฒ ๊ฐ๋ค.
โ ๋ณธ์ธ์ ์นธ์ .๊ณผ *์ ์ด์ฉํ์ฌ ๊ตฌํํ์ฌ์ ์ฑ์ธ ๋๋ *๋ฅผ ์น์ธ ๋๋ .๋ฅผ ๋ฎ์ด์์ฐ๋ฉด์ ์ฝ๋๋ฅผ ์งํํ์๋ค. ๋ฐ๋ผ์ ๊ฒน์น๋ ๊ฒ์ ๋ฏธ๋ฆฌ ํ์ ํ ํ์ ๊ฒน์น์ง ์๋ ๋ธ๋ก๋ง ์ฑ์์ผํด์ ์ฑ์ฐ๊ธฐ ์ ์กฐ๊ฑด์ ํ๋จํ๋ ๊ณผ์ ์ด ๋ง๋ค.
โ ์ฃผ์ด์ง ๋ต์์๋ ์ซ์๋ฅผ ์ด์ฉํ์ฌ ๊ฒน์น๋ ์นธ๋ 2๋ผ๋ ์ซ์๋ก ํํํ ์ ์๊ฒ ํ์๋ค. ๋ฐ๋ผ์ ์ฐ์ ์ ์ผ๋ก ๋ธ๋ก์ ์ฑ์ด ํ์ ํ๋จ ๊ฐ๋ฅํ๋ค. ์ด๋ map์ ๋ ์์ฃผ ๋ณํ์์ผ์ ์ข๋ค๊ณ ๋ณด๊ธด ํ๋ ๊ฒ ๊ฐ๋ค.
Comment