[python]๋ฐฑ์ค€ 1780๋ฒˆ : ์ข…์ด์˜ ๊ฐœ์ˆ˜

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 256 MB 9503 5463 4173 58.667%

๋ฌธ์ œ

N×Nํฌ๊ธฐ์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ข…์ด์˜ ๊ฐ ์นธ์—๋Š” -1, 0, 1์˜ ์„ธ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ํ–‰๋ ฌ์„ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ž๋ฅด๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋‹ค์Œ์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž๋ฅด๋ ค๊ณ  ํ•œ๋‹ค.

  1. ๋งŒ์•ฝ ์ข…์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ์ข…์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  2. (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๋ฌธ์€ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์“ฐ๋„๋ก ํ•  ๊ฒƒ
  • ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋Šฅ ๋ชจ๋“ˆํ™”๋ฅผ ์ค„์ผ ๊ฒƒ
๋ฐ˜์‘ํ˜•