백준 1074번, z
백준 1074번 c++ 문제풀이
문제:
풀이:
- 총 4분면으로 나누어서 진행한다.
- 크기가 1*1이 될때까지 사각형을 4분면으로 쪼갠다(재귀함수를 통해 진행한다)
- 1*1의 좌표가 찾는 좌표라면 그 값을 출력한다. 아니라면 방문한 순서를 증가시켜준다.
- 위에 과정만 진행하면 시간 초과가 된다.
- 4분면 중 찾는 좌표가 있는 분면만 재귀함수를 실행한다.(범위를 조건문으로 달아준다.)
- 방문하지 않는 분면이 있다면, 방문한 순서는 그 분면의 크기를 더해주기만 하면 된다.
코드:
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int input = 0;
void divide(long long n, long long a, long long b, long long r, long long k){//n, 시작 좌표 위치(x,y), 찾는 좌표(x,y)
if(n >= 1){
long long c= pow(2,n)/2;
if(a+2*c>r && b+2*c>k && r>=a && k>=b){//현재 찾는 좌표가 이 사각형 안에 있다면,
divide(n-1, a, b, r, k);//1사분면
divide(n-1, a, b+c, r, k);//2사분면
divide(n-1, a+c, b, r, k);//3사분면
divide(n-1, a+c, b+c, r, k);//4사분면
}
else{//없다면 그냥 사각형 크기 만큼 증가
input+=4*pow(c,2);
}
}else{//n=0일때, 즉 최대로 쪼개졋을 때, 한분면이 숫자 하나일때
if(a==r && b==k){
cout << input;
}
input++;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
long long n, r, c;
cin >> n >> r >> c;
long long s = pow(2,n);
divide(n, 0, 0, r, c);
return 0;
}
처음에는 무조건적으로 벡터에 저장하는 식으로 접근을 하다보니, 메모리 초과가 되었다. 하지만 막상 코드를 다시보니
벡터를 다 지우더라도 코드에 오류가 나지 않고 원하는 답도 제대로 출력된다는 것을 알게 되었다.
감사합니다.
This post is licensed under CC BY 4.0 by the author.