1. 문제 해결 전략
이 문제는 직접 Compare 함수를 작성한 후 특정 조건에의해 정렬방법을 결정하게 해야한다.
(2중 벡터로 작성해도 되지만 효율적이지 못하고 대게 연산자 오버로딩이나 클래스(또는 구조체)를 생성한 후
비교 함수를 통해서 값을 도출해낸다.)
x1 = x2일 때 y1 > y2로 비교하는 문제이므로 다음과 같이 Compare함수를 작성한다.
bool Compare(const vec& v1, const vec& v2)
{
if(v1.x ==v2.x)
return v1.y < v2.y;
else
return v1.x < v2.y;
}
이 때 Parmeter에 const &는 해당 변수값을 변경하지 않고 읽기만 하겠다는 의미이다.
이 함수만 작성할 줄 안다면 다른 정렬문제와 같이 입력값들을 정렬한 후 출력만 하면 끝이다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class vec
{
public:
long long int x;
long long int y;
vec(long long int _x, long long int _y) :x(_x), y(_y) {}
};
std::vector<vec> arr;
bool compared(const vec &v1, const vec &v2)
{
if (v1.x == v2.x)
return v1.y < v2.y;
else
return v1.x < v2.x;
}
int main(void)
{
long long int n;
scanf("%lld", &n);
for (int i = 0; i < n; i++)
{
long long int x, y;
scanf("%lld %lld", &x, &y);
arr.push_back(vec(x, y));
}
std::sort(arr.begin(), arr.end(), compared);
for (int i = 0; i < n; i++)
{
printf("%lld %lld\n", arr[i].x, arr[i].y);
}
}
정렬 문제의 입출력은 scanf , printf를 사용하자! std::cin ,std::cout을 사용하면 시간초과가 뜬다.
2. 걸린 시간
15분
3. 느낀점
생각보다 오래걸렸다. 방법의 문제가 아니라 너무 오랜만에 정렬문제를 풀다보니 Compare함수 작성시 규칙을 지키지 않아서 계속 에러가 뜬 것...
처음에 작성했던 코드를 살펴보자면,
bool Compare(const Vec& v1, const Vec& v2)
{
if(v1.x > v2.x)
{
return v1.x >v2.x;
}else
{
if(v1.y > v2.y)
{
return v1.y > v2.y;
}else
{
return v1.y <v2.y;
}
}else
return v1.x < v2.x;
}
문제점이 보이는가?
비교함수의 결과를 2갈래로 나누어 return한 것이다..
애초에 return v1.x > v2.x라는 결과 자체가 내포한 의미는 '크면 true 작으면 false를 내보내겠다' 인데
그 작업을 2번씩 해버린 것. 그리고 쓸데없이 많은 조건식을 사용했다.
애초에 x값이 같을 때와 같지 않을 때 두갈래로 나뉘고 return의 형식에 의해 알아서 크냐 작냐가 구분가기 때문에
저런 방식은 전제자체가 잘못된 것이다.
4. 링크
https://www.acmicpc.net/problem/11650
11651번도 같은문제.
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[정렬] 11652. 카드 (0) | 2020.04.21 |
---|---|
[정렬] 10825. 국영수 (0) | 2020.02.18 |
[정렬] 10814. 나이순 정렬 (0) | 2020.02.18 |
[정렬] 2571. 수 정렬하기 2 (0) | 2020.02.18 |
[dp] 1149. RGB 거리 (0) | 2020.02.14 |