BOJ : https://www.acmicpc.net/problem/1780

github : https://github.com/junho0956/Algorithm/blob/master/1780/1780/%EC%86%8C%EC%8A%A4.cpp

 

그냥 반복문으로 전체를 훑어도 되지만

문제의 분류가 분할정복이여서 요구하는대로 구현하였다.

 

더보기
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
#include <iostream>
using namespace std;
 
int N;
int arr[2187][2187]; // 3^7
int counter[3]; // -1 0 1
 
void paper_count(int n, int y, int x) {
    bool test = true;
    for (int i = y; i < y+n; i++) {
        for (int k = x; k < x+n; k++) {
            if (arr[i][k] != arr[y][x]) {
                test = false;
                break;
            }
        }
        if (!test) break;
    }
 
    if (test) {
        if (arr[y][x] == -1) counter[2]++;
        else counter[arr[y][x]]++;
    }
    else {
        int div = n / 3;
        for (int i = 0; i < 3; i++) {
            for (int k = 0; k < 3; k++) {
                paper_count(div, y + i * div, x + k * div);
            }
        }
    }
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> N;
    for (int i = 0; i < N; i++) {
        for (int k = 0; k < N; k++) {
            cin >> arr[i][k];
        }
    }
 
    paper_count(N, 00);
    cout << counter[2<< '\n' << counter[0<< '\n' << counter[1];
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 1517번 버블 소트  (0) 2020.01.17
BOJ 1992번 쿼드트리  (0) 2020.01.17
BOJ 11728번 배열 합치기  (0) 2020.01.17
BOJ 11662번 민호와 강호  (0) 2020.01.16
BOJ 10816번 숫자 카드2  (0) 2020.01.16

BOJ : https://www.acmicpc.net/problem/11728

github : https://github.com/junho0956/Algorithm/blob/master/11728/11728/%EC%86%8C%EC%8A%A4.cpp

 

문제는 사실 분할정복을 통한 해결을 요구하고 있지만.. 

그냥 합쳤습니다..

 

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
using namespace std;
 
int N, M;
int arr[2000000];
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> N >> M;
    for (int i = 0; i < N; i++cin >> arr[i];
    for (int i = 0; i < M; i++cin >> arr[i + N];
    sort(arr, arr + N + M);
    for (int i = 0; i < N + M; i++cout << arr[i] << ' ';
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 1992번 쿼드트리  (0) 2020.01.17
BOJ 1780번 종이의 개수  (0) 2020.01.17
BOJ 11662번 민호와 강호  (0) 2020.01.16
BOJ 10816번 숫자 카드2  (0) 2020.01.16
BOJ 10815번 숫자 카드  (0) 2020.01.16

BOJ : https://www.acmicpc.net/problem/11662

github : https://github.com/junho0956/Algorithm/blob/master/11662/11662/%EC%86%8C%EC%8A%A4.cpp

 

삼분탐색의 기본개념을 통해 구현하였으며 설명은 코드에 주석처리 해놓았으니 참고하시면 될 것 같습니다.

삼분탐색 기본개념 : https://junho0956.tistory.com/128?category=869180

 

더보기
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
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#pragma warning(disable:4996)
 
typedef pair<doubledouble> pii;
 
// x -> 0 // y -> 1
// start : 시작점 end : 끝점
int minho_start[2], minho_end[2];
int kangho_start[2], kangho_end[2];
 
pii minho_move(double p) {
    return make_pair(minho_start[0+ (minho_end[0- minho_start[0]) * (p / 100), minho_start[1+ (minho_end[1- minho_start[1]) * (p / 100));
}
 
pii kangho_move(double p) {
    return make_pair(kangho_start[0+ (kangho_end[0- kangho_start[0]) * (p / 100), kangho_start[1+ (kangho_end[1- kangho_start[1]) * (p / 100));
}
 
int main() {
    scanf("%d%d%d%d"&minho_start[0], &minho_start[1], &minho_end[0], &minho_end[1]);
    scanf("%d%d%d%d"&kangho_start[0], &kangho_start[1], &kangho_end[0], &kangho_end[1]);
 
    double first_percent = 0, last_percent = 100, length = sqrt(pow(100002+ pow(100002));
    // 오차는 10^-6 까지 허용한다는 것은 ...
    // 10^-6 까지는 맞춰야된다는 건가? 그럼 10^-7 까지의 오차만 확인해본다면
    while (last_percent - first_percent >= 1e-7) {
        double p1, p2;
        // 삼등분 했을 때 좌표
        p1 = (2 * first_percent + last_percent) / 3, p2 = (first_percent + 2 * last_percent) / 3;
 
        // p1 과 p2 를 이용하여 p1 , p2 만큼 이동했을 때 민호와 강호의 좌표를 구함
        // m1 -> minho_move_p1, m2 -> minho_move_p2 , k1, k2 ,,
 
        pii m1 = minho_move(p1), m2 = minho_move(p2);
        pii k1 = kangho_move(p1), k2 = kangho_move(p2);
 
        // 구해야하는 것은 민호와 강호의 p1, p2 만큼 이동했을 때의 거리
        // p1 에 의한 거리
        double len_p1 = sqrt(pow(m1.first - k1.first, 2+ pow(m1.second - k1.second, 2));
        double len_p2 = sqrt(pow(m2.first - k2.first, 2+ pow(m2.second - k2.second, 2));
 
        length = min(min(len_p1, len_p2), length);
 
        // 삼분탐색 조건에 따라서
        // 만약 len_p1 의 길이가 len_p2 의 길이보다 작다면 len_p2 쪽에는 최소값이 없으므로
        if (len_p1 <= len_p2) last_percent = p2;
        else first_percent = p1;
    }
    // 오차가 10^-6 까지는 허용    => 10^-6 까지는 검사 ==> 10^-7 까지만 출력해보면 
    printf("%.7f", length);
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 1780번 종이의 개수  (0) 2020.01.17
BOJ 11728번 배열 합치기  (0) 2020.01.17
BOJ 10816번 숫자 카드2  (0) 2020.01.16
BOJ 10815번 숫자 카드  (0) 2020.01.16
BOJ 2110번 공유기 설치  (0) 2020.01.16

아직은 기본기만 사용할 줄 알고 특정한 경우에 대한 반례들이 있어 (ex: 평평한 구간에 최솟값, ..)

삼분 탐색을 알고 있다고 말하기는 힘들지만 이해할려고 노력했기 때문에 조심스럽게 글을 써봅니다

 

https://m.blog.naver.com/PostView.nhn?blogId=kks227&logNo=221432986308&proxyReferer=https%3A%2F%2Fwww.google.com%2F

삼분탐색에 대한 공부는 여기서 했으며 정리를 매우 잘해놓으셨으니 제 포스트 보다는 여길 참고하시는게 좋습니다.

 

삼분탐색은 이분탐색과 같은 원하는 값을 위한 증감 범위를 이용한 탐색인데

이분탐색은 정렬이 되어있기 때문에 반드시 임의의 값을 기준으로 한군데는 증가한다면 반대는 감소하는 형식입니다.

말그대로 일차방정식의 직선과 같은 그림을 상상해볼 수 있습니다.

 

반대로 삼분탐색은 어떤 원하는 값들의 형태가 직선형태의 무조건적인 증감을 말하는게 아닌

아래나 위로 볼록한 형태의 특성을 띄는 값들 중에서 원하는 값을 찾기 위해 사용할 수 있는 탐색방법 입니다.

이 탐색방법을 이용하여 이분탐색보다 구체화(?) 된 조건으로 이 볼록한 구간내의 원하는 값을 탐색해나갈 수 있습니다.

이해를 위해 그림으로 설명해보면, 

 

 

이와 같이 표현할 수 있고, 이 볼록한 구간을 이용하기 위해

fp, lp 그리고 삼등분한 p1, p2 를 구하게 된다면

p1 과 p2 를 이용하여 이 곡선(방정식)에 대한 함수값을 구할 수 있게 됩니다.

 

곡선의 식을 Func 라고할때

Func(p1) 의 값이 Func(p2) 보다 작은 경우 알 수 있는 사실은

구간 [p2,lp] 에 존재하는 최소값은 구간 [fp,p2] 에 존재하는 최소값보다 작을 수 없다 입니다.

=> 만약 볼록 구간 중에서 최소값을 찾고자 한다면 구간 [fp,p2] 의 범위를 탐색해야한다 는 뜻입니다.

 

이를 이용하여 fp 와 lp 를 원하는 조건에 맞게 p1 p2 값으로 바꾸어주면서 탐색하는 방법이 삼분 탐색입니다.

 

삼분탐색을 이용한 문제는

BOJ : https://www.acmicpc.net/problem/11662 민호와 강호

BOJ : https://www.acmicpc.net/problem/13310 먼 별

BOJ : https://www.acmicpc.net/problem/8986 전봇대 

등이 있으며

민호와 강호 문제가 삼분탐색을 이용한 문제 중에 제일 기초? 문제 인듯 싶으니 풀어보시면 좋을 것 같습니다.

(삼분탐색으로 안해도 해결가능합니다!)

 

삼분 탐색을 설명했는데 미흡한 부분이나 틀린 부분이 있다면 지적부탁드립니다!

'algorithm > algorithm' 카테고리의 다른 글

볼록껍질 선분 처리하기  (0) 2020.02.28
유클리드 호제법  (0) 2020.02.28
세그먼트 트리 정리  (0) 2020.02.05
선분 교차 판별하기  (0) 2020.02.02
LCS  (0) 2019.07.04

+ Recent posts