작성일 :

문제 링크

11651번 - 좌표 정렬하기 2

설명

2차원 평면 위의 점들을 문제의 조건에 따른 정렬 기준에 따라서 정렬하는 문제입니다.

정렬 기준은 다음과 같습니다.

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

C# 에서는 LINQ 를 활용하여 정렬하였고,

C++ 에서는 sort() 함수의 세 번째 매개변수로 사용될 별도의 비교함수를 구현하여 정렬하였습니다.


C# 에서는 StringBuilder 을 사용하지 않으면 시간 초과 가 됨에 주의합니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace Solution {

  using System.Text;
  class Program {
    static void Main(string[] args) {

      var n = int.Parse(Console.ReadLine()!);

      var coord = new (int, int)[n];
      for (int i = 0; i < n; i++) {
        var points = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
        coord[i] = (points[0], points[1]);
      }

      coord = coord
            .OrderBy(p => p.Item2)
            .ThenBy(p => p.Item1)
            .ToArray();

      var sb = new StringBuilder();
      foreach (var points in coord)
        sb.AppendLine($"{points.Item1} {points.Item2}");

      Console.Write(sb.ToString());

    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

bool comp(const pii& a, const pii& b) {
  if (a.second == b.second)
    return a.first < b.first;
  return a.second < b.second;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  vector<pii> coord(n);
  for (int i = 0; i < n; i++)
    cin >> coord[i].first >> coord[i].second;

  sort(coord.begin(), coord.end(), comp);

  for (const auto& points : coord)
    cout << points.first << " " << points.second << "\n";

  return 0;
}