ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ/Swift] 좌표정렬하기 2 11651
    Legacy/Be Refactoring.. 2021. 9. 12. 01:17

    Baekjoon Online Judge

    단계별로 풀어보기 / 정렬 / 좌표정렬하기 2 11651

    문제에 모든 정보 및 저작권* https://www.acmicpc.net/


    Todo:

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

    Constraints:

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

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

    Input-Output


    (출처 : https://www.acmicpc.net/problem/11651)

    Solution.swift

    let caseCount = Int(readLine()!)!
    var coordinates = [[Int]]()
    
    for _ in 0..<caseCount {
        coordinates.append( readLine()!.split(separator: " ").map{ Int($0)! } )
    }
    
    coordinates.sorted(by: { lhs, rhs -> Bool in
        return lhs[1] < rhs[1] || (rhs[1] == lhs[1] && lhs[0] < rhs[0])
    }).forEach { coordinate in
        print(coordinate.map{ String($0) }.joined(separator: " "))
    }

    github Code Repository

    How I tried this:

    .sorted(by:) 메서드를 조금 고민해 본 문제였다.
    일단 위 메서드에서 첫번째 인자와 두번째 인자를 비교하게되는데
    예를들어 왼쪽부터 오름차순으로 정렬되기를 바란다면
    .sorted(by: $0 < $1) 또는 .sorted(by: <) 이렇게 했을텐데

    원리를 완벽히 이해한건 아니지만 lhs(left handside) 인자와 rhs(right handside) 인자로 보고 두 개를 서로 비교하는 모양이였다.
    일일이 print를 찍어 보았지만 들쑥날쑥이랄까 공식문서를 보지 않고 혼자 해본 뇌피셜이라 알쏭달쏭한 순서이긴 했다.

    추론으로 바로 시도가능한 아이디어는
    < 연산자로 왼쪽 -> 오른쪽으로 오름차순이 되길 바라는 그림이라면
    lhs < rhs 로 볼 수 있는데 왼쪽 결과가 true면 그대로 false면 두 인자는 자리를 바꾼다고 볼 수 있다.

    처음에 if-else로 짜서 true, false를 반환할까 했는데 그게 오히려 가독성도 안좋고 내가 쓰는것도 애초에 햇갈려서

    인자 이름을 lhs rhs로 주고 표기해보았다
    lhs[1] < rhs[1] || (rhs[1] == lhs[1] && lhs[0] < rhs[0]) 를 보자면

    먼저 lhs[1] < rhs[1] 두 좌표에 y축 인자로 볼 수 있는 배열의 두번째 요소를 비교하고 true면 뒤에 or절 이후 || (rhs[1] == lhs[1] && lhs[0] < rhs[0])은 볼 것도 없이 true를 반환하고

    만약 앞선부분이 false라면 뒤에 (rhs[1] == lhs[1] && lhs[0] < rhs[0]) 부분을 볼 텐데 먼저 y축이 같은지 확인하고 같은데다 lhs[0] < rhs[0]가 성립하는지 확인해서 x축의 정렬이 곧 두 좌표의 정렬이 되도록 반환해준다

    뒷 부분이 rhs[1] == lhs[1]까지 false 라면 false or false로 두 좌표는 오름차순 형태를 유지할 수 없어서 위치를 바꾸어준다.

    설명이 길었는데 옳게 .sorted(by:)를 이용하는건지 확신이 없긴하다..
    잘 이용하면 단순한 수의 오름 내림 차순 말고 다양한 정렬이 가능 할것 같다.

    What I got is:

    나만의 lhs rhs 방식으로 정렬하기

    I have to study:

    • .sorted(by:) 메서드 원리 이해해서 심화하기

    문제에 관한 모든 저작권 : https://www.acmicpc.net/

    'Legacy > Be Refactoring..' 카테고리의 다른 글

    [BOJ/Swift] 나이순 정렬 10814  (0) 2021.09.12
    [BOJ/Swift] 좌표 압축 18870  (0) 2021.09.12
    [BOJ/Swift] 소트인사이드 1427  (0) 2021.09.11
    [BOJ/Swift] 수 정렬하기 2 2751  (0) 2021.09.11
    [BOJ/Swift] 수 정렬하기 2750  (0) 2021.09.11
Designed by Tistory.