본문 바로가기

백준

14930 구슬 (BEAD)

으악! 개미문제! 어렵다. 아이디어는 알겠는데 약간 마음으로 이해가 안 된다. 둘이 부딪쳤는데 위치는 같다.. 🧐

 

하나하나 생각해보면 어떻게 돌아가는지 알겠다. 구슬이 부딪쳐도 속도는 같아서 구슬 하나가 움직인 것과 같다. 

 

이럼 또 아니 근데 실제로는 안 움직이잖아요,,, 생각이 드는데 이걸 또 하나하나 움직임을 생각해보면 구슬 하나가 자기 경로로 계속 움직인다는 걸 알게 된다. 

 

그래서 이 문제에 쓰인 아이디어

- 속도는 유지된다

- 구슬 하나가 x + v * t만큼 움직인 위치는 그대로이다

- 구슬의 순서는 유지된다 (부딪혀서 위치가 바뀌지 않으므로)

 

빨간 구슬이 k번째에 있다고 가정했을 때, 

위치를 전부 x + v * t 기준으로 정렬하고 k번째 위치가 빨간 구슬의 위치이다. 

 

아이디어 너무 재밌다. 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

int main() {
    i64 n, t;
    scanf("%lld %lld", &n, &t);
    
    vector<ii64> v(n);
    for (int i = 0; i < n; i++) {
        scanf("%lld %lld", &v[i].xx, &v[i].yy);
    }
    
    // 빨간 구슬의 순번 k를 구함
    i64 redX = v[0].xx;
    i64 k;
    sort(all(v));
    for (int i = 0; i < n; i++) {
        if (v[i].xx == redX)
            k = i;
    }
    
    // x + v * t 기준으로 정렬
    for (int i = 0; i < n; i++) {
        v[i].xx = v[i].xx + v[i].yy * t;
    }
    
    sort(all(v));
    
    
    // k번째를 구함
    printf("%lld", v[k].xx);
    
    return 0;
}

'백준' 카테고리의 다른 글

1024 수열의 합 [미완]  (0) 2021.10.15
1182 부분수열의 합  (0) 2021.10.11
11664 선분과 점  (0) 2021.10.11
1138 한 줄로 서기  (0) 2021.10.11
14713 앵무새  (0) 2021.09.26