배열 자르기, 정렬하기, k번째 수 찾기 문제 풀이

버질·2024년 12월 9일

1. 문제 정의

주어진 배열 array와 명령 목록 commands에 따라 특정 부분 배열을 자르고 정렬 후, 지정된 위치의 값을 찾아 반환하는 문제.

명령(commands)의 구조: [i, j, k]
i: 자를 배열의 시작 인덱스(1부터 시작).
j: 자를 배열의 끝 인덱스(1부터 시작).
k: 정렬된 배열에서 찾을 값의 위치(1부터 시작).

2. 핵심 접근 방법

부분 배열 추출:
i에서 j까지의 값을 잘라내는 데 Python의 슬라이싱처럼 Swift의 Array 서브스크립트 활용.
정렬:
sorted()를 사용하여 자른 배열 정렬.
k번째 값 반환:
정렬된 배열의 인덱스에 접근(k-1).
최종 결과:
각 명령에 대해 결과 값을 계산하여 배열로 반환.

3. 코드 설명

func solution(_ array: [Int], _ commands: [[Int]]) -> [Int] {
    var result = [Int]()  // 결과를 담을 배열

    for command in commands {  // 각 명령을 순회
        let i = command[0]
        let j = command[1]
        let k = command[2]

        // 1. i번째부터 j번째까지 자름
        let sliced = Array(array[i-1...j-1])
        // 2. 정렬
        let sorted = sliced.sorted()
        // 3. k번째 값 추출 후 결과에 추가
        result.append(sorted[k-1])
    }

    return result
}

4. 문법 정리

배열 슬라이싱:
Swift에서는 [i...j]를 통해 배열의 특정 범위를 자를 수 있음. 단, 0-based 인덱싱을 사용하므로 명령에 제공된 1-based 인덱스를 변환(i-1, j-1)해야 함.
정렬:
sorted() 메서드는 배열의 요소를 오름차순으로 정렬해 반환.
결과 추가:
result.append()를 사용하여 값을 배열에 추가.

  1. 입출력 예시
    입력:
let array = [1, 5, 2, 6, 3, 7, 4]
let commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

출력:

let output = solution(array, commands)  // [5, 6, 3]

과정:
명령 1 [2, 5, 3]:
array[1...4] → [5, 2, 6, 3]
정렬: [2, 3, 5, 6]
3번째 값: 5.
명령 2 [4, 4, 1]:
array[3...3] → [6]
정렬: [6]
1번째 값: 6.
명령 3 [1, 7, 3]:
array[0...6] → [1, 5, 2, 6, 3, 7, 4]
정렬: [1, 2, 3, 4, 5, 6, 7]
3번째 값: 3.

6. 느낀 점

Swift의 배열 슬라이싱과 정렬 메서드는 간결한 코드를 작성하는 데 큰 도움을 준다.
1-based 인덱스를 처리할 때 0-based 배열 인덱싱을 고려해야 하는 점이 중요하다.
코드가 간단한 것 같아도 문제를 단계별로 잘 쪼개어 해결하는 연습이 필요함.

profile
iOS Developer · SwiftUI & UIKit '가끔 되고 가끔 안 되는' 문제를 뿌리부터 잡습니다.

0개의 댓글