버그 잡이

코테 - 카카오 블라인드 채용 실패율 문제 (tuple & sort) 본문

카테고리 없음

코테 - 카카오 블라인드 채용 실패율 문제 (tuple & sort)

버그잡이 2021. 7. 21. 19:30

 

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