NYPC2024 무한 길이 물풍선 문제 풀이를 진행하였습니다.
NYPC문제는 BIKO를 통하여 풀었습니다
문제를 읽으면 아래와 같은 해석이 가능합니다.
무한한 길이의 폭발 범위를 가지는 물풍선이 있습니다.
이를 사용하기 위해서는 2차원 평면의 N개의 좌표에 물풍선을 놓아줍니다.
스킬을 사용 시 동일한 x좌표를 가진 두 점에 물풍선이 있을 경우 해당 x좌표의 모든 점이 물풍선의 폭발 범위가 됩니다.(수직인 직선 전부가 폭발 범위가 됨)
또한 동일한 y좌표를 가진 두 점에 물풍선이 있을 경우 해당 y좌표의 모든 점이 물풍선의 폭발 범위가 됩니다.(수평인 직선 전부가 폭발 범위가 됨)
스킬을 사용했을 때 물풍선의 폭발 범위가 되는 수직, 수평 직선의 갯수를 계산하는 프로그램을 작성해야 합니다.
x좌표가 같은 두 개 이상의 점이 있을 경우 해당 x좌표는 폭발하는 수직 직선이 되며
y좌표가 같은 두 개 이상의 점이 있을 경우 해당 y좌표는 폭발하는 수평 직선이 됩니다.
즉, 두 개 이상 같은 수가 있는 x, y가 각각 몇개 있는지 확인해주면 됩니다.
수가 크고 점의 갯수가 있기 때문에 unorderd_map을 사용하였습니다.
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int answer = 0;
int N;
cin >> N;
unordered_map<int, int> checkX;
unordered_map<int, int> checkY;
unordered_map<int, int>::iterator iter;
int x, y;
for (int i = 0; i < N; i++)
{
cin >> x >> y;
iter = checkX.find(x);
if (iter == checkX.end())
{
checkX.emplace(make_pair(x, 1));
}
else
{
if (iter->second == 1)
{
iter->second = 2;
answer++;
}
}
iter = checkY.find(y);
if (iter == checkY.end())
{
checkY.insert(make_pair(y, 1));
}
else
{
if (iter->second == 1)
{
iter->second = 2;
answer++;
}
}
}
cout << answer;
return 0;
}