티스토리 뷰
안녕하세요? iOS Developer, 멍구입니다. 🤗
오늘은 프로그래머스의 알고리즘 연습문제 중, K번째 수를 풀어보겠습니다. ㅎㅎ
프로그래머스 K번째 수 설명
K번째 수 문제의 요점을 요약하면 아래와 같습니다.
- i번째부터, j번째까지의 범위의 값들을 오름차순 정렬한 상태에서 k번째 값을 구해라!!!
이말은 이렇게 볼 수 있습니다.
" i-1 ~ j-1 범위의 배열을 구해서 정렬 후, K-1번째 값을 반환해라!!!"
여기서 왜 -1을 하는지 감이 오시나요?? 바로, 배열의 인덱스는 1부터 시작하는 것이 아닌 0부터 시작하기 때문이죠.
이어서 설명 추가로 보겠습니다.
해당 문제, K번째수의 제한사항은 위와 같습니다. 범위가 크지않아 효율성 문제를 걱정할 필요는 없는 문제입니다.
입출력 예시입니다. 가령 [1, 5, 2, 6, 3, 7, 4]가 있고, [2, 5, 3]의 값을 구하려면, 2 ~ 5 범위의 배열, [5, 2, 6, 3]을 정렬한 [2, 3, 5, 6]의 3번째 값, 5를 구하면 됩니다.
commands는 2차월 배열로 3개의 1차원 배열이 있기때문에 문제에서 의도하는 마지막 결과값은 총 각 1차원배열로부터 구한 3개의 값이 됩니다.
바로 Swift언어 코드로 구현을 해보겠습니다.
K번째 수 Swift 코드 문제풀이
위의 코드는 예제 코드를 그대로 옮긴 내용입니다. array라는 1차원 배열과 i,j,k를 제공하는 commands 2차원 배열을 정의했습니다.
[2, 5, 3], [4, 4, 1], [1, 7, 3] 세개의 1차원 배열에 대해 각각 값을 구해야 합니다.
먼저 앞서 말했듯이, i ~ j 범위의 값을 구분해야합니다. 스위프트에서는 범위지정자( ... )를 통해서 특정 범위의 부분배열을 반환받을 수 있습니다. 현재 값은 [5, 2, 6, 3] 입니다.
또한 해당 부분 배열을 sorted() 메서드를 사용해 바로 정렬할 수 도 있습니다. 그 부분을 이어서 보겠습니다.
이때 범위지정자를 통해 반환받은 부분배열은 [Int](Array<Int>) 타입이 아닌, Array.SubSequence(ArraySlice<Int>) 타입입니다.
[5, 2, 6, 3]에서 sorted() 메서드를 이어 붙여 사용합니다. sorted()는 기본적으로 오름차순 정렬을 해줍니다.
그 결과는 [2, 3, 5, 6]이며, 반환값은 Int타입 배열인 [Int]가 됩니다. 이제 이 상태에서 첨자접근을 통해 K번째 수를 구하면 끝이지요!
sortedSubArray 아래의 kNumber에 들어가는 결과값이 바로 하나의 1차원 배열에 대한 값입니다.
다시한번 말씀 드리지만, 배열의 인덱스는 0부터 시작하므로, -1 처리를 해서 첨자접근을 합니다.
commands에서 접근해서 사용한 map은 배열에서 사용가능한 매핑에 사용하는 메서드(클로져, 고차함수)입니다.
map 연산은 현재 배열의 값을 특정 조건에 따라 매핑해줍니다. 그리고 해당 블럭 내의 $0는 commands에 있는 각각의 1차원 배열이라고 생각하시면 됩니다.
그렇게 보면 위에서 했던 map 매핑 작업은 commands 내에 있는 각 1차원 배열에대한 연산결과로 매핑해서 answer에 반환한다는 것을 이해하실 수있습니다.
해당 코드가 이해가 가시나요? 해당 코드는 위에서 했던 과정을 commands 2차원배열에있는 각 1차원 배열마다 반복해서 수행하는 것입니다.
요약하자면, "commands 2차원 배열 내의 각 1차월 배열에 대해서 i-1 ~ j-1 범위의 값을 정렬 후, k번째 값을 구한 뒤 1차월 배열을 해당 k번째 값으로 매핑하라!!" 라고 할 수 있겠습니다. 🤗
네, 이렇게 답을 구했습니다. 왜냐하면, 프로그래머스 페이지의 문제풀이 화면에서 요구하는 것이 바로 이 코드이기 때문입니다. 바로 적용한 화면을 보시겠습니다.
이렇게 단 한 줄(?)의 스위프트(swift) 코드로 프로그래머스의 알고리즘문제, K먼제 수 문제를 풀 수 있게 되었습니다. 🤗
함수형 패러다임을 채택하고 있는 멀티패러다임언어, 스위프트에서 이러한 메서드(클로져, 고차함수)의 사용은 매우 유용하고 간결한 코드를 작성할 수 있는 강력한 무기가 될 수 있습니다.
만약 위의 코드가 이해가지 않는다면, 개인적으로 플레이그라운드에서 코드를 작성해보며 타입의 변화과정, 값의 도출과정을 확인해보시기 바랍니다. 그럼 이만, 즐거운 하루 되세요~ 👩🏻💻
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
백준 아스키코드 11654, swift asciiValue 문제풀이 (0) | 2020.09.03 |
---|---|
Swift Array 배열 값 제거방법 removeLast, removeFirst (2) | 2020.08.31 |
백준 Swift, 막대기_17608 스택(Stack)문제풀이 (0) | 2020.08.26 |
swift 알고리즘, 문자열 입력 없을 때까지 입력받는 방법 (0) | 2020.08.22 |
Swift 언어 코딩테스트, 입문 전 유용한 팁 정리 (7) | 2020.08.21 |
- Total
- Today
- Yesterday
- SwiftUI
- 스위프트
- 백준알고리즘
- 프로토콜
- publisher
- swift 기초
- 김프매매
- Protocol
- CoreML
- swift reduce
- createML
- 알고리즘
- swift문제
- swift알고리즘
- 프로그래머스swift
- swift string
- 컬렉션
- 부스트코스
- 알고리즘문제
- 자연어처리
- swift
- 백준swift
- Collection
- ios
- 개발자문서
- swift 문자열
- uikit
- 프로그래머스
- Swift 알고리즘
- swift언어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 |