본문 바로가기

컴퓨터 과학/자료구조, 알고리즘

[Rust로 백준 하루 하나] 13-8. 좌표 정렬하기 2

문제 (11651번)

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

 

입력

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

 

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.


풀이

코드

use std::io::{self, BufRead, BufReader, BufWriter, Write};

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());

    let mut n = String::new();
    reader.read_line(&mut n).unwrap();
    let n: usize = n.trim().parse().unwrap();

    let mut points: Vec<Point> = Vec::new();
    let mut point = String::new();
    for _ in 0..n {
        point.clear();
        reader.read_line(&mut point).unwrap();
        let mut point_iter = point
            .trim()
            .split_whitespace()
            .map(|p| p.parse::<i32>().unwrap());
        let x = point_iter.next().unwrap();
        let y = point_iter.next().unwrap();
        let point = Point { x, y };
        points.push(point);
    }
    points.sort_by(|a, b| {
        if a.y != b.y {
            a.y.cmp(&b.y)
        } else {
            a.x.cmp(&b.x)
        }
    });

    let mut writer = BufWriter::new(io::stdout().lock());
    for point in points {
        writeln!(writer, "{} {}", point.x, point.y).unwrap();
    }
}

해설

특이사항 없음


추가 학습

  • 특이사항 없음