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;
}