티스토리 뷰

728x90
반응형

https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

엄~첨 쉽다.

근데 sort함수를 사용하는 중간에 compare함수를 인자로 주어 정렬을 내가 원하는 대로 할 수 있는 방법이 있다. 하지만, 이것을 작성하는 중간에 헷갈리는 요소가 있어 틀렸다.. 이런 실수가 다시는 발생하지 않도록 하기 위해 글을 작성한다.

우선 코드부터 소개하겠다.

sort함수에 대해 알고 싶은 사람은 다음 글을 참고하라.

https://jhcard.tistory.com/13

 

[C++] algorithm 라이브러리

1. sort 알고리즘 include void sort(start, end); algorithm 헤더파일에 sort알고리즘이 속해 있으며 start와 end는 iterator형으로 받는다. 예시로 다음과 같다. #include #include vector v = {4,3,1,5,6}; sor..

jhcard.tistory.com

bool compare(std::pair<int, int> a, std::pair<int, int> b) {
    if (a.second > b.second) return false;
    else if (a.second == b.second && a.first > b.first) return false;
    return true;
}

int main(void) {
    int N = readInt();

    std::vector<std::pair<int, int>> v(N);
    for(int i = 0; i<N; i++) v[i] = { readInt(), readInt() }; 
    
    std::sort(v.begin(), v.end(), compare);
    
    for (auto it = v.begin(); it != v.end(); it++) {
        writeInt(it->first); write(' ');
        writeInt(it->second); write('\n');
    }
    
    bflush();
}

FastIo에 대한 코드 내용은 생략하였다. 궁금하다면 다음 글을 참고하라.

https://jhcard.tistory.com/78

 

[C++] 예외..

아마 이 글은 백준 코딩용이 될 것이다. 풀면서 시간이나 메모리를 절약할 수 있는 방법이 있는 글이다. 주로 FastIO를 다룰 것 같다. 우선 readInt, readChar, writeInt에 대해 다뤄보자. 우선 read부분을

jhcard.tistory.com

코드를 보면 중간에 sort함수에 인자로 compare가 들어간 것을 볼 수 있다. 위의 코드 중 compare는 함수로 표현되어 있다. 그러니까 함수를 생성하고, 그 함수를 sort함수의 인자로 보낼 수 있다는 것이다. 조금 생소하겠지만, 함수도 인자로 전달이 될 수 있다. 반환형을 bool형으로 해주어 만약 a와 b를 비교하여(pair)true가 나오는 쪽이 더 앞쪽에 배치되게 된다.

생각하라. true가 나오면 왼쪽(앞쪽)에 배치된다. 그러니까 이렇게 생각하면 편하다. a는 왼쪽에 있는 요소이고, b는 오른쪽에 있는 요소인데 이 상태에서 true가 나오는 방향이 왼쪽이 되는 것이다.

만약 다음과 같은 예시가 있다고 하자.

#include <cstdio>
#include <algorithm>

bool compare(int a, int b) {
	return a < b;
}

int main(void) {
	int arr[] = { 6,4,1,2,6,2,7,9 };
	std::sort(arr, arr + 8, compare);
	for (int i = 0; i < 8; i++) printf("%d ", arr[i]);
}

이 경우 오름차순으로 정렬이 된다.

하지만 compare함수를 다음과 같이 변경한다면

bool compare(int a, int b){
	return a > b;
}

내림차순으로 정렬이 된다.

참고하기 바란다.

728x90
반응형

'코딩테스트 > Silver 5' 카테고리의 다른 글

[S5] 10814. 나이순 정렬  (0) 2022.07.03
[S5] 11653. 소인수분해  (0) 2022.07.03
[S5] 11866. 요세푸스 문제 0  (0) 2022.07.03
[S5] 1676. 팩토리얼 0의 개수  (0) 2022.07.03
[S5] 10815. 숫자 카드  (0) 2022.07.02