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 |