딱봐도 분할정복하라는것같다.
분할정복을 하면서 순서대로 번호를 붙여나가고 r열 c행의 번호를 출력해주면 될것같다
import sys
n,r,c=map(int,sys.stdin.readline().rstrip().split())
graph=[[0]*(pow(2,n)) for _ in range(pow(2,n))]
count=[0]
def dfs(row,col,n):
if n==1:
graph[row][col]=count[0]
count[0]+=1
return
dfs(row,col,n//2)
dfs(row,col+n//2,n//2)
dfs(row+n//2,col,n//2)
dfs(row+n//2,col+n//2,n//2)
dfs(0,0,pow(2,n))
print(graph[r][c])
일단 이렇게 작성했는데 이대로 내면 매우 높은 확률로 시간초과가 날거다.
n이 15까지 입력될 수 있는데 그러면 30000정도 된다고 생각해야한다.
맵 사이즈가 3*10^4*3*10^4이므로 9*10^8 따라서 10^9정도라고 생각해야한다.
심지어 시간제한도 빡빡하게 줬다.
이 규칙을 이용하면 뭔가 될거같다.
import sys
n,r,c=map(int,sys.stdin.readline().rstrip().split())
result=0
def dfs(row,col,n):
global r,c,result
if n==1:
print(result)
return
if r<row+n//2:
if c<col+n//2:
dfs(row,col,n//2)
else:
result+=(n//2*n//2)
dfs(row,col+n//2,n//2)
else:
if c<col+n//2:
result+=((n//2*n//2)*2)
dfs(row+n//2,col,n//2)
else:
result+=((n//2*n//2)*3)
dfs(row+n//2,col+n//2,n//2)
dfs(0,0,pow(2,n))
사분면으로 나눠서 생각을 한뒤에 첫번째 사분면은 그냥 가면 되고 나머지의 경우 번호를 알아내야하니까 나머지 사분면의 크기를 구한다음에 result에 더한다.
'IT > ps' 카테고리의 다른 글
백준 16928번 뱀과 사다리 게임 (0) | 2025.02.16 |
---|---|
백준 7569번 토마토 (0) | 2025.02.16 |
백준 14940번 쉬운 최단거리 (0) | 2025.02.16 |
백준 11403번 경로 찾기 (0) | 2025.02.16 |
백준 11286번 절대값 힙 (0) | 2025.02.15 |