본문 바로가기
ps연습장

백준 1891번 : 사분면 (C/C++)

by hwsyl 2023. 5. 30.
반응형

<문제>

백준 1891번

 

<풀이>

문제를 해결하기 위한 단계는 아래와 같다.

 

1. 주어진 사분면에 해당하는 좌표를 찾는다.

2. 입력된 좌표만큼 이동한다.

3. 이동한 좌표의 사문면을 구한다.

 

만약 k번 쪼개졌다면 사분면의 개수는 2^k X 2^k이 된다는 사실을 이용하면 쉽게 해결할 수 있다.

주의할점 : 좌표평면을 벗어나면 -1을 출력해주어야한다.

 

<코드>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<bits/stdc++.h>
#define fio()                     \
    ios_base::sync_with_stdio(0); \
    cin.tie(0)
using namespace std;
 
typedef long long ll;
 
ll po[60];
int check[2][2];
 
ll dx(int qu, int i){
    switch(qu){
        case 1:
            return po[i];
        case 2:
            return 0;
        case 3:
            return 0;
        case 4:
            return po[i];
        default:
            return 0;
    }
}
 
ll dy(int qu, int i){
    switch(qu){
        case 1:
            return 0;
        case 2:
            return 0;
        case 3:
            return po[i];
        case 4:
            return po[i];
        default:
            return 0;
    }
}
 
int main(){
    check[1][1= 4;
    check[0][1= 3;
    check[0][0= 2;
    check[1][0= 1;
 
    po[0= 1;
    for(int i = 1; i < 52; i++){
        po[i] = 2*po[i-1];
    }
    int k; scanf("%d"&k);
    ll x = 0, y = 0;
    for(int i = k-1; i >= 0; i--){
        int q; scanf("%1d"&q);
        x += dx(q, i);
        y += dy(q, i);
    }
    ll a, b; scanf("%lld %lld"&a, &b);
    x += a;
    y -= b;
    if(x < 0 || y < 0 || x >= po[k] || y >= po[k]){
        printf("-1");
        return 0;
    }
    for(int i = k-1; i >=0; i--){
        printf("%d", check[x/po[i]][y/po[i]]);
        x %= po[i];
        y %= po[i];
    }
}
cs

<회고>

예외 처리를 못보고 계속 틀렸다는.. 문제를 잘 읽어야겠다.