[백준/BOJ] 1074 Z / C++

Kwaaaaan·2023년 8월 8일
1

알고리즘

목록 보기
2/5

문제

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.

N > 1인 경우, 배열을 크기가 2^N-1 × 2^N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.

N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 정수 N, r, c가 주어진다.

출력
r행 c열을 몇 번째로 방문했는지 출력한다.

제한
1 ≤ N ≤ 15
0 ≤ r, c < 2N

예제 입력 1
2 3 1
예제 출력 1
11
예제 입력 2
3 7 7
예제 출력 2
63
예제 입력 3
1 0 0
예제 출력 3
0
예제 입력 4
4 7 7
예제 출력 4
63
예제 입력 5
10 511 511
예제 출력 5
262143
예제 입력 6
10 512 512
예제 출력 6
786432

입출력 예

  • 다음 예는 22 × 22 크기의 배열을 방문한 순서이다.

  • 다음은 N=3일 때의 예이다.

풀이

저는 기본적으로 재귀를 이용한 방법과 좌표를 탐색하는 식의 방법으로 문제를 풀었습니다. 밑에 코드내용을 일단 먼저 확인하겠습니다.

#include <iostream>
#include <cmath>
using namespace std;

int processcion(int n, int x, int y) 
{
    int result = 0;
    int size = 1;

    for (int i = 0; i < n; i++) 
    {
        int square_size = pow(size, 2);

        int x_bit = (x / size) % 2;
        int y_bit = (y / size) % 2;

        int position = x_bit * 2 + y_bit;
        result += position * square_size;

        size *= 2;
    }

    return result;
}

int main() 
{
    int n, x, y;
    cin >> n >> x >> y;

    int result = processcion(n, x, y);
    cout << result << endl;

    return 0;
}

코드해석

processcion이라는 함수의 매개변수가 왜 3개일지를 먼저 생각해본다면, 기본적으로 2차원 평면상에는 x축과 y축이 존재합니다. 또한 2차원 평면의 크기를 설정해 주기 위해 n을 이용해 크기를 설정합니다. 또한, processcion함수는 정수형으로 선언해놓았습니다. processcion함수의 좌표 (x, y)가 몇번째로 방문하여 이를 계산해 반환하기 위해서 int형으로 선언하였습니다.

main 함수에서 n, x, y를 입력받고 processcion에 n, x, y를 매개변수로 넘겨줍니다.

예제 입력 1
2 3 1
예제 출력 1
11
의 경우를 한번 보도록 하겠습니다.

(2, 3, 1)
n == 2, x == 3, y == 1이 됩니다.

이후 for문을 타게된다면 i는 3번 반복하게 되죠 다음으로는 i가 0, 1, 2일때의 경우를 보죠

첫 번째(i==0)
size = 1
pow(1, 2) = square_size = 1
(3/1)%2 = x_bit --> 1
(1/1)%2 = y_bit --> 1

position = 12+1 = 3
result = 3
1^2(1) = 3
size = 2

두 번째(i==1)
size = 2
pow(2, 2) = square_size = 4
(3/2)%2 = x_bit --> 1
(1/2)%2 = y_bit --> 0

position = 2
result = 3+2*4 = 11
size = 4

세 번째(i==2)
size = 4
pow(4, 2) = square_size = 16
(3/4)%2 = x_bit --> 0
(1/4)%2 = y_bit --> 0

--- 최종 결과
position = 0
result = 11
size = 8
라는 결과가 나옵니다.


오늘은 두번째 백준문제를 풀었는데 생각보다 더욱 고민해보고 풀었던 문제이니만큼 쉽지만은 않았습니다...

profile
스마트팩토리 개발자(를 꿈꾸며)

2개의 댓글

comment-user-thumbnail
2023년 8월 9일

너무 어려워요!

답글 달기
comment-user-thumbnail
2023년 8월 9일

더 쉽게 풀이해주세요!

답글 달기