개발 지식 공유, 복습

백준 - 11651(좌표 정렬하기 2) C++ 본문

알고리즘(백준)

백준 - 11651(좌표 정렬하기 2) C++

like_sonny 2021. 8. 31. 01:21

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

이번엔 다른 좌표 정렬 하기이다. 이전에는 x 기준이 우선시 됐었으나, 이번에는 y기준이 우선시 되고, y가 같을 시, x를 오름차순으로 나열해야 한다. 

 

자료들을 담을 구조는 이전처럼 pair와 vector를 사용했다.

 

이번에는 정렬 기준을 정하는 함수를 따로 만들어 정렬하였다.

 

정렬 기준을 정하는 함수는 이전에 학습해서 쉽게 해결할 수 있었다.

 

아! 혹시 정렬 기준을 정하는 함수를 구현할 때 if 조건을 넣어주는 것이 매우 중요하다!

필자는 단순히 a.second < b.second만 return으로 설정한 결과 오답이 됐었다...

 

 

이번엔 한번에 통과하지 못했다...

 

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

// y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬

bool compare(pair<int, int> a, pair<int, int> b)
{
  if (a.second == b.second)
    // y가 같을 때 x로 오름차순
    return a.first < b.first;
  // y로 오름차순
  return a.second < b.second;
}
int main()
{
  freopen("input.txt", "rt", stdin);
  int n;
  scanf("%d", &n);
  vector<pair<int, int>> vec(n);
  for (int i = 0; i < n; i++)
  {
    scanf("%d %d", &vec[i].first, &vec[i].second);
  }
  sort(vec.begin(), vec.end(), compare);
  for (int i = 0; i < n; i++)
  {
    printf("%d %d\n", vec[i].first, vec[i].second);
  }
  return 0;
}

'알고리즘(백준)' 카테고리의 다른 글

백준 - 2108(통계학) C++  (0) 2021.12.21
백준- 1920(수 찾기) C++  (0) 2021.09.01
백준- 11650(좌표 정렬하기) C++  (0) 2021.08.31
백준-10814(나이순 정렬) C++  (0) 2021.08.28
백준-10989(수 정렬하기 3) C++  (0) 2021.08.28