-
[BOJ/Swift] 좌표정렬하기 2 11651Legacy/Be Refactoring.. 2021. 9. 12. 01:17728x90
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/
728x90'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