상세 컨텐츠

본문 제목

백준 1074 Z

백준 연습

by 빙하둘리 2022. 8. 8. 21:30

본문

728x90

내 사고과정과 캐치 못한거 써서 깃헙에 올리기

바킹독님 재귀 강의 참고

https://blog.encrypted.gg/943?category=773649

#include <iostream>
using namespace std;

int func(int n, int r, int c);
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    int n, r, c;
    cin >> n >> r>>c;
  
    cout<<func(n, r, c);
    return 0;
}

int func(int n, int r, int c) {
 
    int half= 1 << (n - 1);
    //int half=2^(n-1);과 1<<(n-1);은 무슨 차이?
    //pair를 쓸까?
    //4분할의 시작점
    /*    pair <int, int> d1 = {0,0};
    pair <int, int> d2={0, dely};
    pair <int, int> d3 = { delx, -dely };
    pair<int, int>  d4 = { 0, dely };*
    4분할로 영역을 나눈다.
    영역을 옮길때마다 숫자가 더해지는 방식*/
    //영역 분할하면 영역에 따라 숫자가 어떻게 변하는지 봐야한다.
    //barkingdog님 강의에서 영역분할에 따라 어떻게 숫자(몇 번째인지)가 달라지는지
    //관찰했어야 하는데 그걸 못봤다.
    if (n == 0) return 0;
    if (r < half && c < half) return func(n - 1, r, c);
    if (r < half && c >= half) return half * half + func(n - 1, r, c - half);
    if (r >= half && c < half) return 2 * half * half + func(n - 1, r - half, c);
    return 3 * half * half + func(n - 1, r - half, c - half);
    //n=k일 때, n-1=k-1의 함수의 값을 불러주기 위해서 2,3번째 인자를 영역에 따라 조절해준다.

}

틀린 이유)

47393093번 : n,r,c 순서 틀림

추가 제출 부분에서 int half=2^(n-1);로 다시 바꾸고 base condition은 밑에다 뒀더니 틀렸다.

baescondition의 위치(맨 위인지 몇번 사각형인지 조건문 3~4개 앞인지)는 문제가 안된다.

int half=2^(n-1);은 틀렸고 int half=1<<(n-1);은 맞는 표현이다 왜 그런가?

 

윤성우 열혈 C언어 비트 연산자 부분 참고

p.92~95

C/C++에서는 ^연산자가 비트단위 XOR 연산자로 사용된다.

XOR는 같으면 0을 반환, 다르면 1을 반환한다.

0^0이면 0을 반환

0^1이면 1을 반환 

1^0이면 1을 반환

1^1이면 0을 반환

 

2^(n-1)에 n=2가 들어가면

10

01

최종적으로 11을 반환해서 3이 된다. 그래서 우리가 얻고 싶은 n=2일 때, 2의 (n-1)승의 값 2가 나오지 않는다는 문제점이 있다.

C/C++에서 2의 (n-1)승을 구하고 싶으면 1을 왼쪽으로 n-1비트만큼 움직여준다. 1<<n-1

728x90

'백준 연습' 카테고리의 다른 글

백준 class1) 11720번 숫자의 합  (0) 2022.08.11
백준 class1)10951번 A+B-4  (0) 2022.08.10
백준 class1)1008번 A/B  (0) 2022.08.10
백준 10951번 A+B-4 오답  (0) 2022.08.10
백준 2475번 검증수  (0) 2022.08.10

관련글 더보기

댓글 영역