나의 기록, 현진록

[Swift] 프로그래머스 2019 KAKAO BLIND RECRUITMENT > 실패율 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 2019 KAKAO BLIND RECRUITMENT > 실패율

guswlsdk 2022. 7. 19. 13:58
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이

  1.  실패율을 저장할 스테이지 튜플 배열 생성 [(스테이지 번호, 실패율)]
  2.  현재 스테이지 클리어한 사람 구하기
  3.  현재 스테이지인 사람 구하기 = 전체 스테이지 수에서 현재 스테이지 클리어한 사람 빼기
  4.  실패율(스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수) 구해서 튜플 배열에 추가
  5.  스테이지 번호를 실패율 내림차순으로 정렬한다. 만약 실패율이 같으면 스테이지 번호가 낮은 게 우선순위이다.

 

 

코드

 

처음 작성한 정답 제출 시 5, 9, 22번이 시간초과가 발생하였다.

 

import Foundation
 func solution(_ N:Int, _ stages:[Int]) -> [Int] {
     var stageArr: [[Float]] = Array(repeating: Array(repeating: 0, count: 0), count: N+1)
     for i in 1..<stageArr.count{
         stageArr[i].append(Float(i))
         stageArr[i].append(Float(stages.filter{ $0 == i }.count))
         stageArr[i].append(Float(stages.filter{$0 >= i}.count))
         stageArr[i].append(stageArr[i][1]/stageArr[i][2])
     }
     stageArr[1..<stageArr.count].sort{$0[3] > $1[3]}
     return stageArr[1..<stageArr.count].map{Int($0[0])}
 }

현재 스테이지에서 멈춘 사람 수 stages.filter{$0 == i} 

현재 스테이지를 이미 클리어에 도달한 사람의 수 stages.fliter{$0 >= i}는 굳이 배열에 안 넣어도 되긴하다...

 

다른 사람들의 코드를 좀 찾아보았고 원인은 크게 두가지였다.

1. 이차원 배열을 굳이 사용하지 않아도 됨 -> 보다 간단한 자료구조를 이용해서 시간을 단축시키기

2. filter말고 for문을 사용하여 시간을 단축시키기

 

이차원 배열을 튜플배열로 바꾸고, filter 말고 for문을 사용하도록 바꾸자. 그러나 이것만 바꿔서 해결되지 않았다.

 

전체 스테이지 수에서 현재 스테이지에 도달했으나 클리어하지 못한 사람의 수를 빼면 스테이지를 이미 도달한 사람의 수가 나온다.

즉, stages.fliter{$0 >= i}는 없어도 된다. 이 문장이 속도를 절반가까이 줄여주었다.

import Foundation
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var stageArr = [(Int,Float)]()
    var player = stages.count
    for i in 1...N{
        var clear = 0
        for item in stages{
            if i == item{
                clear += 1
            }
        }
        player -= clear

        stageArr.append((i, Float(clear)/Float(player)))
    }
    stageArr.sort{$0.1 > $1.1}
    return stageArr.map{$0.0}
}

 

반응형