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 |
Tags
- base64 변환
- Tuist
- Android
- convert base64
- oberve url
- 스크롤 탭
- detect url
- 상단 탭바
- GeometryReader
- Side Menu
- scrolling tab
- pod install
- List
- DevelopmentRegion
- swift
- swift #swift keychain #keychain 사용법
- development language
- UIPresentationController
- ios
- SwiftUI
- 개발자 면접
- transformation.map
- UIViewControllerTransitioningDelegate
- 기존 앱
- DataBinding
- url 추적
- notifychanged
- url 관찰
- ViewBuilder
- Swift Package Manager
Archives
- Today
- Total
버그 잡이
코테 - 카카오 블라인드 채용 실패율 문제 (tuple & sort) 본문
2019 kakao blind 채용 문제 - 실패율
https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
위 문제는 아래와 같은 방식으로 풀 수 있다.
여기서 핵심은 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