[c++] BOJ 1393๋ฒˆ :: ์Œํ•˜์ฒ ๋„ ๊ตฌ๊ตฌํŒ” (์ฝ”๋“œ, ์ฃผ์˜ํ•  ์ , ํ…Œ์ŠคํŠธ์ผ€์ด์Šค)

์Œํ•˜์ฒ ๋„ ๊ตฌ๊ตฌํŒ”

https://www.acmicpc.net/problem/1393

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 128 MB 445 64 57 29.082%

๋ฌธ์ œ

์ตœ๋ฐฑ์ค€์€ ์Œํ•˜์ฒ ๋„ ๊ตฌ๊ตฌํŒ”์— ํƒ”๋‹ค.

๋ฌธ์ œ๋Š” ๊ตฌ๊ตฌํŒ”์˜ ๊ธฐ์žฅ์ธ ์กฐ๊ต ๊น€์žฌํ™์ด ๋ฐ˜์ฏค ๋ฏธ์ณ์„œ ์—ด์ฐจ๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ๋ฐฑ์ค€์€ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ๋Š” ์—ด์ฐจ์—์„œ ๋›ฐ์–ด๋‚ด๋ ค์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋›ฐ์–ด๋‚ด๋ฆด ๋•Œ ์ •๋ฅ˜์žฅ ๊นŒ์ง€ ๊ฑฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€๋ฉด ๋งˆ์ด ์•„ํ”Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฒ ๋„๊ฐ€ ์ •๋ฅ˜์žฅ์— ๊ฐ€์žฅ ๋งŽ์ด ๊ทผ์ ‘ํ–ˆ์„ ๋•Œ ๋›ฐ์–ด๋‚ด๋ฆฌ๊ณ ์ž ํ•œ๋‹ค.

์–ด๋””์„œ ๋›ฐ์–ด๋‚ด๋ ค์•ผ ํ•˜๋Š”๊ฐ€?

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ •๋ฅ˜์žฅ์˜ ์œ„์น˜ x y๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ํ˜„์žฌ ์—ด์ฐจ์˜ ์œ„์น˜ X Y์™€ ์—ด์ฐจ๊ฐ€ ์ดˆ๋งˆ๋‹ค ์ด๋™ํ•˜๋Š” x์ขŒํ‘œ y์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์—ด์ฐจ๋Š” ํ•ญ์ƒ ์ง์„ ์œผ๋กœ ์›€์ง์ธ๋‹ค.

์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” -100์ด์ƒ, 100์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ตœ๋ฐฑ์ค€์ด ๋›ฐ์–ด๋‚ด๋ฆฌ๋Š” ์œ„์น˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ •๋‹ต์€ ํ•ญ์ƒ ์ •์ˆ˜์ด๋‹ค.

 

์ฃผ์˜ ํ•  ์ 

  • 1์ดˆ ๋‹จ์œ„๋กœ ๋›ฐ์–ด๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
  • ๊ธฐ์ฐจ๋Š” ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๊ฐ„๋‹ค.

 

๋‚˜์˜ ๋‹ต

์ฝ”๋“œ
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int x_pt, y_pt, X, Y, del_x, del_y;
double dist;
pair<int, int> near_point;


double getDistance(int x, int y) {
    double tmp = pow((x - x_pt), 2) + pow((y - y_pt), 2);
    return tmp;
}


void findNearDist() {
    double x = X; double y = Y;
    while (1) {
        x += del_x;
        y += del_y;

        double tmp = getDistance(x, y);
        if (tmp > dist) { // ๊ฑฐ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์œผ๋ฉด
            break;
        }
        else {
            dist = tmp;
            near_point.first = x; near_point.second = y;
        }
    }

}

void fixDel() {
    int small = min(del_x, del_y);

    // ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ 0์ด๋ฉด ๋‚˜๋จธ์ง€๋Š” 1 (์ค‘์š”!)
    if (small == 0) {
        if (del_x == 0)
            del_y = 1;
        else
            del_x = 1;
        return;
    }

    // ๋‘˜ ๋‹ค 0์ด ์•„๋‹ˆ๋ฉด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋กœ ๋‚˜๋ˆ ์ฃผ๊ธฐ
    while (small) {
        if (del_x%small == 0 && del_y%small == 0) {
            break;
        }else
            small--;
    }

    if (small > 1) {
        del_x /= small; del_y /= small;
    }
}

int main() {
    cin >> x_pt >> y_pt;
    cin >> X >> Y >> del_x >> del_y;

    dist = getDistance(X, Y); // ์ฒซ๋ฒˆ์งธ ์œ„์น˜์—์„œ์˜ ๊ฑฐ๋ฆฌ
    near_point.first = X; near_point.second = Y;

    fixDel();
    if(del_x!=0 || del_y!=0)
        findNearDist();

    // ๋‘˜๋‹ค 0์ด๋ฉด ๊ทธ๋ƒฅ ์ถœ๋ ฅ
    cout << near_point.first << " " << near_point.second;
}
ํ…Œ์ŠคํŠธ์ผ€์ด์Šค
100 102
0 0 0 0
=> 0 0

5 2
2 1 2 4
=> 3 3

5 2
2 1 1 1
=> 4 3

50 72
0 0 7 3
=> 70 30

50 72
0 0 0 4
=> 0 72

50 72
0 0 4 0
=> 50 0

 

๋‹ค๋ฅธ ๋‹ต

brute force๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•