1074: Z

ewillwin·2023년 6월 15일
0

Problem Solving (BOJ)

목록 보기
69/230

import sys

def conquer(x, y, N):
	global cnt; global result
	result[cnt] = [x, y]

	if N // 2 >= 1:
		for i in range(x, x + N):
			for j in range(y, y + N):
				conquer(x, y, N//2)
				conquer(x, y + N//2, N//2)
				conquer(x + N//2, y, N//2)
				conquer(x + N//2, y + N//2, N//2)
				return
	cnt += 1

N, r, c = map(int, sys.stdin.readline()[:-1].split())

cnt = 0
result = dict()
conquer(0, 0, 2**N)
#print(result)
answer = [key for key, val in result.items() if val == [r, c]]
print(answer[0])
  • 시간 초과 발생
    -> 모든 부분을 재귀 호출하지 말고, [r, c]의 위치의 cnt만 효율적으로 구해야할듯

import sys

def conquer(x, y, N):
	global cnt
	
	if x > r or x + N <= r or y > c or y + N <= c: # 굳이 재귀 호출을 하지 않아도 되는 경우
		cnt += N ** 2
		return

	if N > 2: # 재귀 호출 진행
		conquer(x, y, N//2)
		conquer(x, y + N//2, N//2)
		conquer(x + N//2, y, N//2)
		conquer(x + N//2, y + N//2, N//2)
		return
	else: # [r, c] 발견한 경우
		if r == x and c == y:
			print(cnt)
		elif r == x and c == y+1:
			print(cnt + 1)
		elif r == x+1 and c == y:
			print(cnt + 2)
		else:
			print(cnt + 3)
		exit()

N, r, c = map(int, sys.stdin.readline()[:-1].split())

cnt = 0
conquer(0, 0, 2**N)
  • 1) x > r or x+N <= r or y > c or y+N <= c: 굳이 재귀 호출을 하지 않아도 되는 경우 (단위 정사각형 외의 경우) -> cnt에 N**2를 더해줌
  • 2) N > 2: 재귀 호출을 진행하여 단위 정사각형에 도달해야함
  • 3) 1), 2) 외의 경우: [r, c]가 있는 단위 정사각형에 도달한 경우임 -> 조건을 분기하여 cnt 출력해주기
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글