백준

2261번 가장 가까운 두 점(라인 스위핑, set) - ☆

조주똥 2020. 8. 27. 00:34

#문제링크 : https://www.acmicpc.net/problem/2261

<전략>

1. 라인 스위핑이라는 개념으로 풀었습니다. 저는 라인 스위핑이라는 개념조차 몰랐기에 블로그를 참고했습니다.

※주의사항

1. map과 set의 정렬방식은 다음과 같다. 만약 map<pair<int, int>, int> 타입이라면 pair가 키, int가 값이 된다. map에서는 앞요소 -> 뒷요소 순으로 정렬된다. <<2,100>,1000>, <<2,99>,1000>, <<2,101>,1000>, <<3, 1>,1001> 이 있다면 map.upper({1,100})의 값은 <<2, 99>, 1000> 을 가리키는 반복자가 된다. 그 이유는, upper는 해당 값보다 큰 값이 처음 나오는 곳의 인덱스를 반환하는데, 1보다 큰 값은 2다. 위에서 2가 세개 존재하지만, first요소가 2인 애들중에, second요소가 가장 작은 놈인 <<2,99>,1000>의 반복자를 반환한다. 비교 방식은 first 최우선이라 first가 1보다 큰 2인 녀석이 존재 하므로 second 비교는 할 필요도 없이 그냥 first가 2인 녀석들 중에 제일 앞에 있는 녀석이 나오게 된다. 즉, map.upper({1,100})에서 100은 사실상 무의미하고 2인 녀석이 여러명이라면 이제 이 2인 녀석들 중 second가 제일 작은 놈이 제일 앞에 정렬되어 있으므로 2,99 가 나오게 되는것이다.

2. int a = sqrt(10) 에서 a = 3이 된다. 즉, 소수점 아래값을 버린다. 이렇게 되면 바운더리가 더 좁아지므로 ceil함수를 이용해서 바운더리를 충분히 가질 수 있게 해줘야 한다.

3. pair값을 넣는 방법은 make_pair 말고도 "{first, second}" 형식으로 넣어주면 된다.

4. auto 자료형은 우변의 데이터 자료형을 추론해서 맞춰준다.

Code