반응형
<문제>
백준 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 |
<회고>
예외 처리를 못보고 계속 틀렸다는.. 문제를 잘 읽어야겠다.
'ps연습장' 카테고리의 다른 글
백준 28257번 : 알록달록 초콜릿 만들기(C/C++) (0) | 2023.06.30 |
---|---|
백준 23760번 : 까다로운 아이들과 선물상자(C/C++) (0) | 2023.06.01 |
백준 4225번 : 쓰레기 슈트 (C/C++) (0) | 2023.05.17 |
백준 7869번 : 두원 (C/C++) (0) | 2023.05.16 |
백준 16437번 : 양 구출 작전 (C/C++) (2) | 2023.05.09 |