[백준/C++]#11650 - 좌표 정렬하기

2021. 1. 27. 23:43필요/코딩테스트(백준)

 

 

풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Point {		// 구조체를 통해 자료형 생성
	int x, y;
};

  bool cmp(Point &u, Point &v) {	// sort에 사용할 비교함수
	if (u.x < v.x) {
		return true;
	}
	else if (u.x == v.x) {
		return (u.y < v.y);
	}
	else 
		return false;
}

int main() {
	int n;
	cin >> n;
	vector <Point> a(n);
	for (int i=0; i<n; i++) {	// 입력받음
		cin >> a[i].x >> a[i].y;
	}
	sort(a.begin(), a.end(), cmp);	// 정렬
	for (int i=0; i<a.size(); i++) {	// 출력
		cout << a[i].x << " " << a[i].y << '\n';
	}
	return 0;
}

개념

일단 x좌표와 y좌표를 묶기 위해, 구조체를 정의했다. 구조체는 다양한 형이 들어갈 수 있는 자료형이다.

 

그리고 sort() 함수를 사용하기 위해 algorithm 라이브러리를 사용했다.

sort함수는 기본적으로 sort(arr, arr+n); 형식이다.

사용자 정의 함수를 사용하고 싶다면 3번째 항을 추가해 sort(arr, arr+n, compare); 이렇게 사용할 수 있다.

그리고 새롭게 Vector STL을 사용하는데, 이는 크기가 가변적으로 변하는 배열 역할을 한다.

front(), back(), begin(), end(), size() 등의 함수를 사용할 수 있다.

 


풀이 

 

일단 숫자 입력(n)을 받고 이 입력만큼 새롭게 받는 입력을 반복한다.

달라진 점은 vector와 구조체의 사용이다.

vector <Point> a(n)의 경우 n의 크기에 해당하는 배열을 0으로 초기화하고 선언하는 문장이다.
이는 Point 자료형으로 구현되므로, 내부의 변수를 .을 통해 사용할 수 있다.
입력받을 때와 출력할 때, for문 안에서 a[i].x 와 a[i].y가 사용된다.

또한 이번에 cmp 함수를 사용해 sort()를 사용해보았다. cmp함수는 bool 함수로, 내부에서 if문을 사용해 구현했다


+a

다른방법①

라이브러리의 기능을 더 사용해, vector<pair<int,int>> a(n)를 사용하면 구조체를 사용하지 않아도 된다.

이 경우 a[i].first, a[i].second를 사용한다.

 

다른방법②

연산자 오버로딩을 할 수 있다. 이는 사용자 정의 연산자이다.

struct Point {
    int x, y;
    bool operator < (const Point &v) const {
        if (x < v.x) {
            return true;
        } else if (x == v.x) {
            return y < v.y;
        } else {
            return false;
        }
    }
};

방식은 사실 잘 모르겠으나, 이를 사용하면 3번째 인자가 필요 없다고 한다.

 

인자의 값이 함수 내부에서 바뀌지 않는다고 확신할 때 const 키워드를 붙인다고 한다.

나중에 발생할 수 있는 실수들을 줄여준다.

맨 위의 풀이에도 bool cmp(const Point &u, const Point &v) 이런 식으로 표현해야 할 것이다.

'필요 > 코딩테스트(백준)' 카테고리의 다른 글

[백준/C++]#10825 - 국영수  (0) 2021.01.29
[백준/C++]#10814 - 나이순 정렬  (0) 2021.01.28
[백준/C++]#2745 - 진법 변환  (0) 2021.01.26
[백준/C++]#11005 - 진법 변환2  (0) 2021.01.25
[백준/C++]#9613 - GCD 합  (0) 2021.01.24