Doby's Lab

백준 2358번: 평행선 (C++) 본문

PS/BOJ

백준 2358번: 평행선 (C++)

도비(Doby) 2022. 5. 28. 22:15

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

 

2358번: 평행선

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

www.acmicpc.net


Solved By: Map

 

한 점을 여러 번 선택할 수 있기 때문에 예를 들어 x좌표가 같은 것이 2개 이상이라면 하나의 직선을 만들 수 있습니다.

즉, 점들을 모아서 중복되는 x값들이 2개 이상, 혹은 중복되는 y값들이 2개 이상이 확인된다면 하나의 직선으로 카운트합니다.

 

허나, 좌표의 절댓값이 2^31보다 작은 정수이므로 배열을 사용할 수 없습니다.

그러므로 map을 사용하여 문제를 풀 수 있습니다.

 

아직은 map의 활용도가 적습니다. 어떠한 key가 몇 개인지를 파악할 때, 사용하는 그 정도인 듯합니다.

#include <iostream>
#include <map>
using namespace std;

int main(){
    int n; cin >> n;
    
    map<int, int> mx;
    map<int, int> my;
    
    for(int i = 0; i < n; i++){
        int x, y; cin >> x >> y;
        mx[x]++; my[y]++;
    }
    
    int result = 0;
    
    for(auto mi : mx){
        if(mi.second >= 2) result++;
    }
    
    for(auto mi : my){
        if(mi.second >= 2) result++;
    }
    
    cout << result;
    return 0;
}
728x90