티스토리 뷰

ALGORITHM/백준

[Python] 백준 - Z(1074번)

johnyejin 2020. 3. 20. 00:01

문제출처 - https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 배열의 크기가 2^N * 2^N라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문한다. 다음 예는 2^2 * 2^2 크기의 배열을 방문한 순서이다. N이 주어졌을 때, (r,

www.acmicpc.net

틀린 풀이

n, r, c = map(int, input().split())
location = 0  # 몇사분면에 있는지
answer = 0

while n >= 1:
    temp = 2 ** (n - 1)

    if r < temp <= c:
        location = 2
    elif c < temp <= r:
        location = 3
    elif temp <= r and temp <= c:
        location = 4

    if n == 1:
        break
    answer += (location - 1) * (2 ** temp)
    if r > 1:
        r //= 2
    if c > 1:
        c //= 2
    n -= 1


if location is 2:
    answer += 1
elif location is 3:
    answer += 2
elif location is 4:
    answer += 3
print(answer)

while문을 돌면서 해당 좌표가 몇사분면에 있는지 찾고 범위를 계속 줄여나감

 

근데 왜틀렸는지 모르겠음..

 

 

성공한 풀이

n, r, c = map(int, input().split())
answer = 0

while n >= 1:
    temp = 2 ** (n - 1)

    if n == 1:
        if r is 0 and c is 1:  # 2사분면
            answer += 1
        elif r is 1 and c is 0:  # 3사분면
            answer += 2
        elif r is 1 and c is 1:  # 4사분면
            answer += 3
        break

    if r < temp <= c:  # 2사분면
        answer += temp ** 2
        c -= temp
    elif c < temp <= r:  # 3사분면
        answer += (temp ** 2) * 2
        r -= temp
    elif temp <= r and temp <= c:  # 4사분면
        answer += (temp ** 2) * 3
        r -= temp
        c -= temp

    n -= 1


print(answer)

이것도 마찬가지로 해당 좌표가 몇사분면에 있는지 찾고 범위를 계속 줄여나감

 

예를 들어, 좌표가 3사분면에 있다면 1,2사분면은 지나온거니까 그 갯수만큼 더해줌 -> 좌표가 1사분면에 있으면 지나온게 없으니까 더해줄 필요 X

 

범위를 줄여나갈때마다 좌표값을 temp만큼 빼줘야함

 

 

$ 주의해야 할 것 - 번호는 0부터 시작!! $

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함