[LV.1] K번째 수

Heedon Ham·2023년 4월 18일
0
post-thumbnail

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다. 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.

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

하나의 element를 구하는 과정은 다음과 같다.

Step1) i번째 ~ j번째까지의 array의 element를 임시 배열에 저장한다.
Step2) 임시 배열을 정렬
Step3) 임시 배열의 k번째 element를 결과로 얻는다.

2차원 배열 commands에서 각 command마다 하나의 element를 구할 수 있다.
따라서 결과 배열을 생성하고, 하나의 element를 구할 때마다 결과 배열에 추가한다.

import Foundation

func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
    
    var result = [Int]()
    
    for command in commands {
        var selectedArray = [Int]()
        for index in command[0]-1...command[1]-1 {
            selectedArray.append(array[index])        
        }
        result.append(selectedArray.sorted()[command[2]-1])
    }

    return result
}

조금 더 정돈된 배열 활용

map: 배열의 각 element를 매핑해서 변형할 때 사용

array.map { closure }를 활용, closure로 기존 배열의 element를 새롭게 매핑한 뒤, 새로운 배열을 return함

closure에서 $0은 2차원 배열 commands의 각 command, 1차원 배열을 의미한다.

해결 과정은 다음과 같다.

Step1) commands의 각 command에 대하여 ($0)
Step2) i, j, k값을 변수로 저장
Step3) array의 i번째부터 j번째까지를 뽑고, 정렬을 한 뒤, k번째 element를 반환
Step4) 반환된 element를 command를 대신하여 commands에 저장 (map)
Step5) 변환된 commands를 반환

func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] { 
	return commands.map{ 
    	let i = $0[0]-1 
        let j = $0[1]-1 
        let k = $0[2]-1 
        return array[i...j].sorted()[k] 
    } 
}
profile
dev( iOS, React)

0개의 댓글