이 문제는 주어지는 입력값이 매우 크고, 제한 시간이 짧기 때문에 리스트를 만들어서 숫자를 나열한 후에 (r, c)에 있는 숫자를 출력하는 방식으로는 통과할 수 없다.

 

따라서 단순 구현식으로 이중리스트를 만드는 것이 아니라,

규칙을 찾아서 재귀함수를 통해 숫자를 출력해주는 것이 옳은 방법이다.

 

def solve(n, x, y):
  global result
  if n == 2:
    if x == r and y == c:
      print(result)
      return # 현재의 함수에서 빠져 나와라
    result += 1

    if x == r and y + n/2 == c:
      print(result)
      return
    result += 1

    if x + n/2 == r and y == c:
      print(result)
      return
    result += 1

    if x + n/2 == r and y + n/2 == c:
      print(result)
      return 
    result += 1
    return 

  solve(n/2, x, y)
  solve(n/2, x, y + n/2)
  solve(n/2, x + n/2, y)
  solve(n/2, x + n/2, y + n/2)

N,r,c = map(int, input().split())
result = 0
solve(2**N, 0, 0)
복사했습니다!