[정렬] 11650. 좌표 정렬

알고리즘/백준 알고리즘

2020. 2. 18. 16:56

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