Baekjoon

Baekjoon 1074번 Z

ppwag 2020. 8. 9. 22:13

문제

https://www.acmicpc.net/problem/1074

걸린 시간

02 : 16 : 02

풀이

Python3

def zsearch(start, side, loc, r, c):
    arr_size = side**2
    quarter = arr_size//4

    # 2x2 크기까지 나누어지면
    if side//2 == 1:
        z_s = start # z start
        for i in range(loc[0], loc[0]+2):
            for j in range(loc[1], loc[1]+2):    
                if i == r and j == c:
                    print(z_s)
                z_s += 1
    else:
        index = 0
        s_l = [] # start list
        for s in range(start, start+arr_size, quarter): # ex) 0, 64, 16
            s_l.append(s)

        for i in range(loc[0], loc[0]+side, side//2):
            for j in range(loc[1], loc[1]+side, side//2):
                if i <= r and j <= c and i+(side//2) >= r and j+(side//2) >= c:
                    zsearch(s_l[index], side//2, [i, j], r, c)
                index += 1

if __name__ == "__main__":
    N, r, c = map(int, input().split())    

    side = 2**N
    zsearch(0, side, [0, 0], r, c)

2n x 2n 크기의 배열에 모든 값을 기록하고 r, c 좌표로 접근하려고 했지만 메모리 초과가 났다.

n의 최대 입력인 15가 들어오면 어마어마한 크기의 2차원 배열이 만들어지기 때문이다.

2차원 배열이 존재한다고 가정하고 문제를 풀어야 한다.

재귀 호출도 찾으려는 좌표가 범위 내에 존재할 경우에만 호출, 배열에 값을 기록하는 대신 찾으려는 좌표 값과 비교해 일치할 때만 출력 하면된다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 7576번 토마토  (0) 2020.08.10
Baekjoon 18870번 좌표 압축  (0) 2020.08.09
Baekjoon 11399번 ATM  (0) 2020.08.09
Baekjoon 11726번 2xn 타일링  (0) 2020.08.09
Baekjoon 1463번 1로 만들기  (0) 2020.08.09

댓글