[python]๋ฐฑ์ค€ 1074๋ฒˆ : Z

 

๋ฌธ์ œ

ํ•œ์ˆ˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด (ํ•ญ์ƒ 2^N * 2^N ํฌ๊ธฐ์ด๋‹ค)์„ Z๋ชจ์–‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2*2๋ฐฐ์—ด์„ ์™ผ์ชฝ ์œ„์นธ, ์˜ค๋ฅธ์ชฝ ์œ„์นธ, ์™ผ์ชฝ ์•„๋ž˜์นธ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์นธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด Z๋ชจ์–‘์ด๋‹ค.

img

๋งŒ์•ฝ, 2์ฐจ์› ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2^N * 2^N๋ผ์„œ ์™ผ์ชฝ ์œ„์— ์žˆ๋Š” ์นธ์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฐฐ์—ด์„ 4๋“ฑ๋ถ„ ํ•œ ํ›„์— (ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ 2^(N-1)๋กœ) ์žฌ๊ท€์ ์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

๋‹ค์Œ ์˜ˆ๋Š” 2^2 * 2^2 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ์ด๋‹ค.

img

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, (r, c)๋ฅผ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋‹ค์Œ ๊ทธ๋ฆผ์€ N=3์ผ ๋•Œ์˜ ์˜ˆ์ด๋‹ค.

img

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N r c๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 15๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , r๊ณผ c๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 2^N-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚˜์˜ ๋‹ต

์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•œ ์ขŒํ‘œ์˜ ์œ„์น˜๋ฅผ 4๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์† ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌ

  1. ๋ช‡ ๋ฒˆ์งธ Z์ธ์ง€ ์ฐพ๊ธฐ

    1. ์ฃผ์–ด์ง„ ํŒ์„ 1/4๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ, ์–ด๋””์— ์†ํ•˜๋Š” ์ง€ ์ €์žฅ

    2. 1๋ฒˆ์„ ๋‚˜๋ˆˆ ๋ฌถ์Œ์ด 4์นธ์งœ๋ฆฌ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ๊นŒ์ง€ (๊ฐ€์žฅ ์ž‘์€ Z๊ฐ€ ๋  ๋•Œ๊นŒ์ง€) ์ง„ํ–‰

      ์ฃผ์–ด์ง„ n์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ 1์”ฉ ๋นผ๊ฐ€๋ฉด์„œ ํ•˜๋ฉด ๋จ

  2. 1์—์„œ ์ฐพ์€ Z ๋ชจ์–‘์—์„œ ๋ช‡๋ฒˆ์งธ์— ์†ํ•˜๋Š” ์ง€ ์ฐพ๊ธฐ

์ž…๋ ฅ์ด 3 1 6 ์ผ ๋•Œ์˜ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

findLocation ํ•จ์ˆ˜๋Š” n์ด 1์ด๋ฉด ์ €์žฅํ•ด๋‘” array๋ฅผ returnํ•œ๋‹ค. ๊ทธ ์ „๊นŒ์ง€๋Š” n์„ 1์”ฉ ๊ฐ์†Œ์‹œ์ผœ๊ฐ€๋ฉฐ 2^(n-1)์„ ๊ธฐ์ค€์œผ๋กœ x, y ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ z๋ชจ์–‘์œผ๋กœ 1,2,3,4๋กœ ๋‚˜ํƒ€๋‚ด์„œ array์— ์ €์žฅํ•œ๋‹ค.

findLocation ํ•จ์ˆ˜๋ฅผ ์ง€๋‚˜๋ฉด ๋ฐฐ์—ด์ด ๋‚˜์™€์„œ ๊ฐ€์žฅ ์ž‘์€ Z๋ชจ์–‘์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์ˆ˜๊ฐ€ ์–ด๋–ค ์œ„์น˜์— ์žˆ์—ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์ฐพ๊ณ ์žํ•˜๋Š” (1,6) ์œ„์น˜์˜ 22๋Š” ์ฒซ๋ฒˆ์งธ ์ฃผํ™ฉ์ƒ‰ ํ…Œ๋‘๋ฆฌ์—์„œ ์ฐพ์„ ๋•Œ(2^2 ๊ธฐ์ค€) 2๋ฒˆ์งธ ์œ„์น˜์— ์žˆ๊ณ , ๋‘๋ฒˆ์งธ ๋นจ๊ฐ„์ƒ‰ ํ…Œ๋‘๋ฆฌ์—์„œ ์ฐพ์„ ๋•Œ(2^1 ๊ธฐ์ค€) ๋˜ํ•œ 2๋ฒˆ์จฐ ์œ„์น˜์— ์žˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ Z๋ชจ์–‘์ด๋ฏ€๋กœ ์žˆ์œผ๋ฏ€๋กœ array์— [2,2]๋ฅผ ์ €์žฅํ•œ ํ›„ return ํ•œ๋‹ค.

๊ทธ ํ›„, calIndex ํ•จ์ˆ˜๋กœ ์ฃผ์–ด์ง„ ์œ„์น˜์— ์žˆ๋Š” ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ, array์—์„œ ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉด์„œ 4์˜ ์ง€์ˆ˜์Šน๋งŒํผ์„ ๊ณฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ•ด๋‹น ์‹์€ ์ฃผํ™ฉ์ƒ‰ ํ…Œ๋‘๋ฆฌ์—์„œ 2๋ฒˆ์งธ์— ์œ„์น˜ํ–ˆ์œผ๋ฏ€๋กœ 4^2๋งŒํผ์˜ ์ˆซ์ž๊ฐ€ (2-1)๋ฒˆ ์ง€๋‚˜๊ฐ”๊ณ , ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ์—์„œ 2๋ฒˆ์งธ์— ์œ„์น˜ํ–ˆ์œผ๋ฏ€๋กœ 4^1๋งŒํผ์˜ ์ˆซ์ž๊ฐ€ (2-1)๋ฒˆ ์ง€๋‚˜๊ฐ”์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ๊ณ„์‚ฐํ•˜๋ฉด ๋ฐ”๋กœ ์ „ Z๋ชจ์–‘๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๊ฒƒ์ด๋‹ค. ํ˜„์žฌ Z๋ชจ์–‘์—์„œ ํ•ด๋‹น ์œ„์น˜๊ฐ€ ์–ด๋–ค ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ ์•Œ๋ ค๋ฉด Z์ƒ์— ์–ด๋Š ์ชฝ์— ์œ„์น˜ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผํ•œ๋‹ค. ์ด๋Š” ์ฃผ์–ด์ง„ r, c๋ฅผ ๊ฐ€์ง€๊ณ  ํŒ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

r,c๊ฐ€ ๋ชจ๋‘ ์ง์ˆ˜์ด๋ฉด Z๋ชจ์–‘์˜ ์ฒซ๋ฒˆ์งธ์— ์œ„์น˜ํ•˜๋ฏ€๋กœ 0์„ ๋”ํ•ด์ฃผ๊ณ , Z๋ชจ์–‘์„ ๋”ฐ๋ผ์„œ 1์”ฉ ์ถ”๊ฐ€๋˜๋Š” ๊ฐœ๋…์ด๋‹ค. ์ด ๋ง์…ˆ๊นŒ์ง€ ๋งˆ์น˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ•ด๋‹น ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ฝ”๋“œ
import math

N,c,r = map(int,input().split()) #c: y, r: x

def findLocation(loc_index,x,y,n): # ์œ„์น˜ ์ •๋ณด ๋ฐ˜ํ™˜
    if n==1: # ๊ฐ€์žฅ ์ž‘์€ Z๋ชจ์–‘์ผ ๋•Œ
        return loc_index

    location = 0
    if x<pow(2,n-1):
        if y<pow(2,n-1):
            location = 1
        else:
            location = 3
            y-=pow(2,n-1)
    else:
        if y<pow(2,n-1):
            location = 2
            x-=pow(2,n-1)
        else:
            location = 4
            x-=pow(2,n-1)
            y-=pow(2,n-1)
    loc_index.append(location)
    return findLocation(loc_index,x,y,n-1)


def calIndex(loc_index,n,sum):
    if n!=1:
        for i in range(n-2,-1,-1): # ๋ช‡๋ฒˆ์งธ Z์ธ์ง€
            sum+=int(pow(4,n-i-1)*(loc_index[i]-1))
    if r%2: # Z์ƒ์˜ ์œ„์น˜ ํŒŒ์•…
        if c%2:
            sum+=3
        else: 
            sum+=1
    else:
        if c%2:
            sum+=2
        #else:sum+=0
    return sum


location_array = list()
location_array = findLocation(location_array,r,c,N)
if len(location_array)==N-1:
    print(calIndex(location_array,N,0))
else:
    print("error")
์‹œ๊ฐ„ ๋ณต์žก๋„

์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์•…์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ตฌํ•ด๋ณด์ž. ์ž…๋ ฅ N์ด 15์ดํ•˜์ด๋ฏ€๋กœ, 15์ผ ๋•Œ findLocation ํ•จ์ˆ˜์—์„œ ์žฌ๊ท€๊ฐ€ 14๋ฒˆ ์‹คํ–‰๋œ๋‹ค. ์ด ๊ฒฝ์šฐ๊ฐ€ ์ตœ์•…์ด๊ณ  calIndex ํ•จ์ˆ˜๋Š” for๋ฌธ์ด O(1)์ด๋ฏ€๋กœ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

N์„ 15๋กœ ๋‘๊ณ  ๋Œ๋ ธ์„ ๋•Œ, 0.02s ์†Œ์š”๋˜์—ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

N์„ 15๋กœ ๋‘๊ณ  ๋Œ๋ ธ์„ ๋•Œ, 9128KB ์†Œ๋ชจ๋˜์—ˆ๋‹ค.

๋Š๋‚€ ์ 

๊ฒฝ๊ณ„๊ฐ’์œผ๋กœ ์ œ์ถœ ์ „ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ธ ๋“ฏํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•