[Swift] [85일차] 2545_다중 기준 sorting

·2025년 3월 4일
0

SwiftAlgorithm

목록 보기
90/105
post-thumbnail

2545. Sort the Students by Their Kth Score


문제 설명

  1. 사진에 나와있듯이 사람 마다의 과목당 점수가 주어진다.
  2. 주어진 k번째 과목의 점수별로 재정렬하면 완성

문제 풀이

  1. 결국 Sorting을 어떻게 다채롭게 할 것이냐의 문제였다.
  2. 카카오 문제중에 있었던 것 같은데, 그거는 이렇게 사람별로가 아니라, 아예 블럭별로 관리하는거라서 그거의 하위호환문제라고 보시면 될 것 같다.
  3. 문제는 쉽게 풀려서 sort관련 포스팅이 될 것 같다.

최종 제출 코드

class Solution {
    func sortTheStudents(_ score: [[Int]], _ k: Int) -> [[Int]] {
        return score.sorted(by: { $0[k] > $1[k]
        })
    }
}

문법이 조금 더 어렵게 되나?해서 이단 손가는대로 이게 sort를 주어진대로 [k]번째원소로 정렬을 해주니까 바로 성공이 되었는데, 이제 다른사람 코드와 함께 이걸 sort관련해서 좀 더 아아보는 시간을 가져보는 기회로 활용하고자 한다.


타인의 코드

class Solution {
    func sortTheStudents(_ score: [[Int]], _ k: Int) -> [[Int]] {
        guard !score.isEmpty else { return [] }

        let numStudents = score.count
        let numExams = score[0].count

        let values: [(Int, Int)] = score.enumerated().map { ($0.offset, $0.element[k]) }

        let studentIds: [Int] = values.sorted { $0.1 > $1.1 }.map { $0.0 }
        return studentIds.map { score[$0] }
    }
}

offset , element[k]로 몇번째친구인지, 그리고 k번째 과목이 몇점인지 나오게 해줬고,
그 튜플을 기반으로 sorting해준것을 볼 수가 있다.
그리고 let studentIds: [Int] = values.sorted { $0.1 > $1.1 }.map { $0.0 }는 무슨 소리냐면 이게 값을 print해보면 찍으면 아래와 같이 등수가 나오게 되는 것이다.
[1, 0, 2] 그래서 이 등수를 score[등수배열원소하나씩]map을 쳐준게 이제 정렬된 배열인 것.


다중기준 SORT관련 포스팅 !

그래서 이번에는 이렇게 좀 종종나오는 이슈인데, 다중기준으로 복잡한 데이터구조일때 어떻게 sorting할 수 있는지에 관련해서 좀 알아보고자한다.

아래는 다중 기준 정렬(Sorting with Multiple Criteria)에 대한 포스팅 초안입니다. Swift 공식 문서를 참조하고, 적당히 복잡한 예시 코드를 포함해 실용적이면서 너무 길지 않게 정리했습니다. 자연스럽고 괜찮은 포스팅이 될 수 있도록 구성해 보았습니다.


Swift에서 다중 기준으로 정렬하기

Swift의 sorted(by:) 메서드에서는 내가 커스텀해서 좀 복잡한 것도 sorting이 가능한데 그 부분을 좀 다뤄보고자한다 ! Swift - sorted(by:) 공식 문서

다중 기준 정렬 - 하나의 값으로 정렬하다가 동점이 나오면, 추가적인 기준으로 정렬 순서를 결정하는 방식

예제: 학생 성적과 이름으로 정렬

학생들의 두 과목 점수와 이름을 담은 배열을 다중 기준으로 정렬해 보겠습니다. 첫 번째 과목 점수로 내림차순 정렬하고, 동점이면 이름순으로 오름차순 정렬하는 상황을 가정합니다.

struct Student {
    let name: String
    let scores: [Int]
}

let students = [
    Student(name: "Charlie", scores: [85, 90]),
    Student(name: "Alice", scores: [90, 85]),
    Student(name: "Bob", scores: [90, 95]),
    Student(name: "David", scores: [85, 80])
]

let sortedStudents = students.sorted { (lhs, rhs) in  //lhs,rhs는 방정식 왼쪽, 오른쪽 같은 의미로 그냥 원 / 투 라고 생하시면 될 것 같다 
    // 첫 번째 기준: 과목 점수순
    if lhs.scores[0] != rhs.scores[0] {    // 과목 점수가 다르면 일딴 내림차순으로 하고
        return lhs.scores[0] > rhs.scores[0]
    }
    // 두 번째 기준: 이름순 // 그게 같으면 이름 순으로 해주는 것 
    return lhs.name < rhs.name
}

for student in sortedStudents {
    print("\(student.name): \(student.scores[0])")
}
// 출력:
//이름 : Alice: 점수 90
//이름 : Bob: 점수 90
//이름 : Charlie: 점수 85
//이름 : David: 점수 85
  • 조건 - 우선순위에 따라 좀 직관적으로 조건문 써서 우선순위대로 조절할 수 있다. 클로저 형태로 원하는대로 커스텀해서 sorting해주자
  • 성능 - 근데 성능면에서는 이게 비교횟수가 많아지니까 잘 생각해서 필요한 조건만 써주는걸 지향해야한다.
profile
기억보단 기록을

0개의 댓글