์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
2 ์ด | 256 MB | 9503 | 5463 | 4173 | 58.667% |
๋ฌธ์
N×Nํฌ๊ธฐ์ ํ๋ ฌ๋ก ํํ๋๋ ์ข ์ด๊ฐ ์๋ค. ์ข ์ด์ ๊ฐ ์นธ์๋ -1, 0, 1์ ์ธ ๊ฐ ์ค ํ๋๊ฐ ์ ์ฅ๋์ด ์๋ค. ์ฐ๋ฆฌ๋ ์ด ํ๋ ฌ์ ์ ์ ํ ํฌ๊ธฐ๋ก ์๋ฅด๋ ค๊ณ ํ๋๋ฐ, ์ด๋ ๋ค์์ ๊ท์น์ ๋ฐ๋ผ ์๋ฅด๋ ค๊ณ ํ๋ค.
- ๋ง์ฝ ์ข ์ด๊ฐ ๋ชจ๋ ๊ฐ์ ์๋ก ๋์ด ์๋ค๋ฉด ์ด ์ข ์ด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- (1)์ด ์๋ ๊ฒฝ์ฐ์๋ ์ข ์ด๋ฅผ ๊ฐ์ ํฌ๊ธฐ์ 9๊ฐ์ ์ข ์ด๋ก ์๋ฅด๊ณ , ๊ฐ๊ฐ์ ์๋ฆฐ ์ข ์ด์ ๋ํด์ (1)์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ด์ ๊ฐ์ด ์ข ์ด๋ฅผ ์๋์ ๋, -1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์, 0์ผ๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์, 1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ ๊ตฌํด๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1≤N≤3^7, N์ 3^k ๊ผด)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๋ก ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ -1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ, ๋์งธ ์ค์ 0์ผ๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ, ์ ์งธ ์ค์ 1๋ก๋ง ์ฑ์์ง ์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋์ ๋ต
์ฒซ๋ฒ์งธ ์ฝ๋
def returnArea(arr,value,size):
tmp_arr = list()
for i in range(0,size//3):
tmp = list()
for j in range(0,size//3):
tmp.append(arr[i+(value//3)*(size//3)][j+((value%3)*(size//3))])
tmp_arr.append(tmp)
return tmp_arr
def calPaperNum(size,num_arr,arr):
first_v = arr[0][0]
tmp = 0
for i in range(0,size): # n
for j in range(0,size): # n
if not(first_v == arr[i][j]):
tmp = 1
for k in range(0,9): # 9
area = returnArea(arr,k,size)
num_arr = calPaperNum(size//3,num_arr,area)
return num_arr
# n^(2logn)
if not(tmp):
num_arr[first_v+1]+=1
return num_arr
์ฐ์ ์ด์ ์ ํ์๋ ๋ฐฉ์๋๋ก ๊ตฌ์ฑ์ ํด๋ณด์๋ค. ์ฃผ์ด์ง array๋ฅผ ๋๋ฉด์ ๋ค๋ฅธ ๋ถ๋ถ์ด ๋ฐ๊ฒฌ๋๋ฉด returnArea๋ผ๋ ํจ์์์ 9๋ฑ๋ถ์ผ๋ก ์ชผ๊ฐ์ง array๋ฅผ return ๋ฐ์ ํ๋์ฉ ๋ค์ ์ฌ๊ท๋ก ๋๋ฆฌ๋ ๋ฐฉ์์ด๋ค. ์ฌ๊ธฐ์ ์๊ฐ ๋ณต์ก๋๋ n^(2logn)์ด ๋์๋๋ฐ, ์ด๋ ์ฃผ์ด์ง ์ ํ์กฐ๊ฑด์ ํจ์ฌ ๋ฐ์ด๋๋๋ค.
์ฌ๊ธฐ์ ์ด์ '์ฟผ๋ ํธ๋ฆฌ' ๋ฌธ์ ๋ถํฐ ์๋ชป ์ดํดํ๋ค๋ ๊ฑธ ์ ์ ์๋ค. ๋ถํ ์ ๋ณต์ ์ด์ฉํด์ผ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ ๋ฌธ์ ์ธ๋ฐ ๊ณ์ ์์ ํ์์ผ๋ก ๊ตฌํํ๋ ค ํ๋ ๊ฒ์ด๋ค.
๋๋ฒ์งธ ์ฝ๋
def calPaperNum(size,num_arr,arr):
first_v = arr[0][0]
tmp = 0
for i in range(0,size): # n
for j in range(0,size): # n
if not(first_v == arr[i][j]):
tmp = 1
break
if tmp:
break
if not(tmp):
num_arr[first_v+1]+=1
return num_arr
else:
for k in range(0,9): # 9
area = returnArea(arr,k,size)
num_arr = calPaperNum(size//3,num_arr,area)
return num_arr
for๋ฌธ ๋ด์ ์ฌ๊ท๊ฐ ์์ด์ ๋ณต์ก๋๊ฐ ์ปค์ง๋๊ฐํด์ ๋ฐ์ ์์น์์ผ๋ณด์์ง๋ง, ์ด์ฐจํผ ์ฌ๊ท์ ๋ค์ด๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ๋ ์คํํ๋ ์ ์ ๊ฐ์ผ๋ฏ๋ก ๊ฐ์ ์ด ์์๋ค.
์ต์ข ์ฝ๋
import operator
line = int(input())
paper_arr = list()
for i in range(0,line):
paper_arr.append(list(map(int,input().split())))
def calPaperNum(size,type_arr,num_arr,arr,sx,sy):
start_y = sy+(type_arr//3)*(size)
start_x = sx+(type_arr%3)*(size)
first_v = arr[start_y][start_x]
tmp = 0
for i in range(start_y,start_y+size): # n
for j in range(start_x,start_x+size): # n
if not(first_v == arr[i][j]):
tmp = 1
break
if tmp:
break
if not(tmp):
num_arr[first_v+1]+=1
return num_arr
else:
for k in range(0,9):
num_arr = calPaperNum(size//3,k,num_arr,arr,start_x,start_y)
return num_arr
# O(n^2)
for obj in calPaperNum(line,0,[0,0,0],paper_arr,0,0):
print(obj)
๊ฒฐ๊ตญ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๋ ค๊ณ ํจ์๋ก ๋ฐ๊พธ์๋ ๊ฒ๋ค์ด ํด๊ฐ ๋์ด ๋์์๋ค. ๋ถํ์ํ ํจ์๋ฅผ ์ค์ด๊ณ for๋ฌธ์ด ์ต๋ํ ๊ฒน์น์ง ์๊ฒ ๋๋ ์ด์ ๊ฐ์ ํํ๊ฐ ๋์๋ค. returnArea ํจ์๋ ๊ทธ ์์ฒด๋ง์ผ๋ก 2์ค for๋ฌธ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ ์ฌ๊ทํจ์๋ก ๋์ด์์ ๋ ์ฃผ์ด์ง ๋งค๊ฐ๋ณ์๋ก ๋ฒ์๋ฅผ ํํํ๊ธฐ๋ก ํ๋ค. ์ฆ, ์ชผ๊ฐ์ง array๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ๊ณ์ฐํ ํ์์์ด, ์ฃผ์ด์ง array ์์ฒด์์ ํ์ฌ ๊ณ์ฐํ array์ ๋ฒ์๋ฅผ ํํํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ์๋ค.
์ด๋ฐ ์์ผ๋ก ํํํ๋ ๊ฒน์น๋ for๋ฌธ์ด ์ค๊ณ ์๊ฐ ๋ณต์ก๋๋ ์ค์์ง๋ง ๋ฐฑ์ค ๊ธฐ์ค์ผ๋ก 66876KB์ ๋ฉ๋ชจ๋ฆฌ์ 7004ms์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค. python ์ฝ๋ ์ค 4000ms ์ฆ์์ผ๋ก ๋ณต์ก๋๋ฅผ ์ค์ธ ์ฝ๋๊ฐ ์์ผ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ ์๊ฐํด๋ด์ผํ ๊ฒ ๊ฐ๋ค.
๋ฐฐ์ด ๊ฒ
- for๋ฌธ์ ์ต๋ํ ์ ๊ฒ ์ฐ๋๋ก ํ ๊ฒ
- ๋ณต์ก๋๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ ๊ธฐ๋ฅ ๋ชจ๋ํ๋ฅผ ์ค์ผ ๊ฒ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python]๋ฐฑ์ค 1699๋ฒ : ์ ๊ณฑ์์ ํฉ (0) | 2020.03.06 |
---|---|
[python]๋ฐฑ์ค 6549๋ฒ : ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ (0) | 2020.03.06 |
[python]๋ฐฑ์ค 5620๋ฒ : ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ ๊ฑฐ๋ฆฌ (0) | 2020.03.01 |
[python]๋ฐฑ์ค 1992๋ฒ : ์ฟผ๋ํธ๋ฆฌ (0) | 2020.02.29 |
[python]๋ฐฑ์ค 1074๋ฒ : Z (0) | 2020.02.21 |
Comment