2545. Sort the Students by Their Kth Score
문제 설명
- 사진에 나와있듯이 사람 마다의 과목당 점수가 주어진다.
- 주어진 k번째 과목의 점수별로 재정렬하면 완성
문제 풀이
- 결국 Sorting을 어떻게 다채롭게 할 것이냐의 문제였다.
- 카카오 문제중에 있었던 것 같은데, 그거는 이렇게 사람별로가 아니라, 아예 블럭별로 관리하는거라서 그거의 하위호환문제라고 보시면 될 것 같다.
- 문제는 쉽게 풀려서 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을 쳐준게 이제 정렬된 배열인 것.
그래서 이번에는 이렇게 좀 종종나오는 이슈인데, 다중기준으로 복잡한 데이터구조일때 어떻게 sorting할 수 있는지에 관련해서 좀 알아보고자한다.
아래는 다중 기준 정렬(Sorting with Multiple Criteria)에 대한 포스팅 초안입니다. 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해주자
- 성능 - 근데 성능면에서는 이게 비교횟수가 많아지니까 잘 생각해서 필요한 조건만 써주는걸 지향해야한다.