Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 상단 탭바
- detect url
- DataBinding
- convert base64
- 개발자 면접
- Side Menu
- UIPresentationController
- url 관찰
- Swift Package Manager
- ViewBuilder
- base64 변환
- oberve url
- GeometryReader
- development language
- swift
- DevelopmentRegion
- transformation.map
- SwiftUI
- swift #swift keychain #keychain 사용법
- ios
- 기존 앱
- Tuist
- url 추적
- 스크롤 탭
- pod install
- notifychanged
- scrolling tab
- UIViewControllerTransitioningDelegate
- List
- Android
Archives
- Today
- Total
버그 잡이
코테 - 카카오 블라인드 채용 실패율 문제 (tuple & sort) 본문
2019 kakao blind 채용 문제 - 실패율
https://programmers.co.kr/learn/courses/30/lessons/42889
위 문제는 아래와 같은 방식으로 풀 수 있다.
여기서 핵심은 failure 라는 튜플 형태의 배열이다.
이렇게 관리하면 stage, count, failure 각각 관리 하는 것보다 직관적이고
이후 sort할때 유용하다.
import Foundation
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
guard N >= 1 && N <= 500 else { return [] }
var failure: [(stage: Int, count: Int, failure: Float)] = Array(repeating: (0, 0, 0), count: N)
// count 계산
for value in stages {
let stage = value - 1
guard stage >= 0 else { continue }
guard stage < N else { continue }
failure[stage] = (stage, failure[stage].count + 1, 0)
}
// failure 계산
var userRemained = stages.count
for index in 0..<failure.count {
var fail = failure[index]
fail.stage = index + 1
if userRemained == 0 {
fail.failure = 0
} else {
fail.failure = Float(fail.count) / Float(userRemained)
print(Float(fail.count / userRemained))
}
failure[index] = fail
userRemained = userRemained - fail.count
}
// sort
let sorted = failure.sorted {
if $0.failure == $1.failure {
return $0.stage < $1.stage
} else {
return $0.failure > $1.failure
}
}
return sorted.map { $0.stage }
}
이처럼 정렬을 해야하는데 정렬의 기준 데이터가 여러개인 경우 tuple을 활용하면 좋다.
한번 더 최적화 하기
아래 sort 로직을 보다 간단하게 만들 수 있다.
let sorted = failure.sorted {
if $0.failure == $1.failure {
return $0.stage < $1.stage
} else {
return $0.failure > $1.failure
}
}
아래와 같이 코드를 작성해서 위와 같은 결과를 얻을 수 있다.
(.failure로 비교하여 정렬하고 .failure가 같을 경우 .stage로 비교하여 정렬한다)
let sorted = failure.sorted {
($0.failure, $1.stage) > ($1.failure, $0.stage)
}
반응형
Comments