알고리즘/백준

백준 2358 평행선

등반 2021. 12. 26. 23:25

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

 

2358번: 평행선

첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 줄에는 각 점의 좌표가 주어진다. 만약 입력에 서로 같은 두 점이 주어지면, 그 두 점을 이용하여 직선을 만들 수 있다. 좌표는 절댓값이 231보

www.acmicpc.net

문제 해설

평면 상의 n개의 점들 중 2개를 선택하여 x축 또는 y축에 평행한 직선이 몇 개나 되는지 알아내는 문제다.

만약 3개 이상의 점들이 한 직선을 이룬다면 직선의 수는 한 번만 센다.(중복 X)

동일한 점이 주어지는 경우 직선을 만들 수 있다고 한다.

>> 이 경우 무한개의 방향으로 뻗어나가는 직선 중 x축과 y축에 평행한 직선 2개를 센다.

#include <iostream>
#define fio cin.tie(0)->sync_with_stdio(0)
using namespace std;

#include <vector>
#include <algorithm>
#include <set>
int main(){
    fio;
    int N; cin >> N;
    vector<pair<int, int> > by_x;   //(x, y);
    vector<pair<int, int> > by_y;   //(y, x);
    for(int i=0; i < N; i++){
        int x, y; cin >> x >> y;
        by_x.push_back(make_pair(x, y));
        by_y.push_back(make_pair(y, x));
    }
    
    //
    sort(by_x.begin(), by_x.end());
    sort(by_y.begin(), by_y.end());
    set<int> x_axis, y_axis;
    for(int i=0; i < by_x.size()-1; i++){
        if(by_x[i].first == by_x[i+1].first){
            x_axis.insert(by_x[i].first);
        }
    }
    for(int i=0; i < by_y.size()-1; i++){
        if(by_y[i].first == by_y[i+1].first){
            y_axis.insert(by_y[i].first);
        }
    }
    cout << x_axis.size() + y_axis.size();
    return 0;
}

코드 해설

n개의 점을 (x, y), (y, x)구조의 벡터에 저장한다.

각각의 벡터에서 이웃한 데이터의 첫번째 값이 같은 경우 x축 또는 y축에 평행한 직선을 만들 수 있다.

평행한 직선을 모두 set에 집어넣어 중복없이 저장한다.

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 4351 Hay Points  (0) 2021.12.27
백준 4158 CD  (0) 2021.12.26
백준 1417 국회의원 선거  (0) 2021.12.26
백준 5957 Cleaning the Dishes  (0) 2021.12.26
백준 18241 문자열 게임  (0) 2021.12.26