[BOJ] C++ 11650 "좌표 정렬하기" 문제 풀이 _ nov

반응형
반응형

#INFO

난이도 : SILVER5

문제 유형 : 정렬

출처 : 11650번: 좌표 정렬하기 (acmicpc.net)


#SOLVE

시간복잡도를 생각하지 않고 무작정 구현했더니, 시간초과가 발생했다.

아래는 모든 원소를 차례로 비교하는 방식의 알고리즘인데, 이는 n의 값이 100,000이 되었을 때 거의 100초에 달하는 시간이 걸리게된다.

#include <bits/stdc++.h>
using namespace std;

int main(){
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  vector<pair<int, int>> xy;
  xy.resize(n);
  for(int i = 0; i < n; ++i){
    cin >> xy[i].first >> xy[i].second;
  }
  for(int i = 0; i < n; ++i){
    for(int j = i + 1; j < n; ++j){
      if(xy[i].first > xy[j].first){
        iter_swap(xy.begin() + i, xy.begin() + j);
      } 
      else if((xy[i].first == xy[j].first) &&
        (xy[i].second > xy[j].second)){
        iter_swap(xy.begin() + i, xy.begin() + j);
        }
    }
  }

  for(int i = 0; i < n; ++i){
    cout << xy[i].first << " " << xy[i].second << '\n';
  }
  return 0;
}

 

해결방법은 간단하다. C++ STL <algorithm> 헤더에 정의된 sort 정렬함수를 사용하면 된다.

sort 함수는 quick sort 기반 알고리즘으로 제작된 intro sort 알고리즘을 사용하는데, 항상 O(nlogn)의 시간복잡도를 보장한다.

_ About sort

#include <bits/stdc++.h>
using namespace std;

int main(){
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  vector<pair<int, int>> xy;
  xy.resize(n);
  for(int i = 0; i < n; ++i){
    cin >> xy[i].first >> xy[i].second;
  }
  sort(xy.begin(), xy.end());
  for(int i = 0; i < n; ++i){
    cout << xy[i].first << " " << xy[i].second << '\n';
  }
  return 0;
}
반응형

댓글

Designed by JB FACTORY