티스토리 뷰

728x90

https://programmers.co.kr/learn/courses/30/lessons/42748?language=swift 

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

정렬

자연수 (1~100) 배열이 주어지고 command : [시작점, 끝점, K]가 배열로 주어진다.

자연수 배열을 시작점과 끝점 범위에 맞게 자른뒤 정렬하고, 그 중 K번째수를 구한다

각 command의 K번째수를 담은 배열을 반환하는 문제

 

접근방법(접근방법1)

command를 for문으로 순회하며 subArray를 구하고, 정렬한 뒤, K번째 인덱스를

result 배열에 append함 -> 최종적으로 result배열을 반환

 

개선된 접근방법(접근방법2)

command 하나에 K번째수 하나가 대응되므로 commands(이차원배열)을 map을 이용하여 처리

map 함수 내에서 command하나를 -> K번째 수로 대응 (위의 접근방법과 동일한 처리)

 

클린코드 책을 보고있어서 변수 선언을 되도록 해주려고 하는데 실행시간이 효율적이지 못할거라고 생각했지만

접근방법1의 코드를 별도의 변수선언없이 배열의 서브스크립트만을 사용했을때가 시간이 미세하게 오래걸렸음(프로그래머스 실행결과 상)

확실히 접근방법2가(변수를 따로 선언하지 않음) 실행시간이 미세하게(0.01ms) 적게 나오긴 함.

 

9줄이 1줄로 줄여질때의 쾌감..

 

소스코드

import Foundation

// 접근방법1
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
    var ks: [Int] = []
    for command in commands {
        let start = command[0]-1
        let end = command[1]-1
        let k = command[2]-1
        
        let subArray = array[start...end].sorted()
        ks.append(subArray[k])
    }
    
    // 같은 for 문 동작
    for command in commands {
        ks.append(array[command[0]-1...command[1]-1].sorted()[command[2]-1])
    }
    return ks
}

// 접근방법2
func solution2(_ array:[Int], _ commands:[[Int]]) -> [Int] {
    return commands.map { array[$0[0]-1...$0[1]-1].sorted()[$0[2]-1] }
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/02   »
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
글 보관함