티스토리 뷰

반응형

 

 

 

 

안녕하세요? iOS Developer, 멍구입니다. 🤗

오늘은 프로그래머스의 알고리즘 연습문제 중, K번째 수를 풀어보겠습니다. ㅎㅎ 

 

 

 

 


프로그래머스 K번째 수 설명

프로그래머스 K번째 수 설명
프로그래머스 K번쌔수 설명내용

K번째 수 문제의 요점을 요약하면 아래와 같습니다.

- i번째부터, j번째까지의 범위의 값들을 오름차순 정렬한 상태에서 k번째 값을 구해라!!!

 

이말은 이렇게 볼 수 있습니다.

" i-1 ~ j-1 범위의 배열을 구해서 정렬 후, K-1번째 값을 반환해라!!!"

 

여기서 왜 -1을 하는지 감이 오시나요?? 바로, 배열의 인덱스는 1부터 시작하는 것이 아닌 0부터 시작하기 때문이죠. 

이어서 설명 추가로 보겠습니다. 

 

 

 

프로그래머스 K번째 수 2
프로그래머스 K번쌔수 설명내용2

해당 문제, K번째수의 제한사항은 위와 같습니다. 범위가 크지않아 효율성 문제를 걱정할 필요는 없는 문제입니다. 

 

 

 

프로그래머스 K번째 수 설명 3
프로그래머스 K번쌔수 설명내용3

입출력 예시입니다. 가령 [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 코드 문제풀이

프로그래머스 K번째 수 문제풀이
프로그래머스 K번쌔수 swift 문제풀이 코드


위의 코드는 예제 코드를 그대로 옮긴 내용입니다. array라는 1차원 배열과 i,j,k를 제공하는 commands 2차원 배열을 정의했습니다. 

[2, 5, 3], [4, 4, 1], [1, 7, 3] 세개의 1차원 배열에 대해 각각 값을 구해야 합니다. 

 

 

프로그래머스 K번째 수 문제풀이 2
프로그래머스 K번쌔수 swift 문제풀이 코드2

먼저 앞서 말했듯이, i ~ j 범위의 값을 구분해야합니다. 스위프트에서는 범위지정자( ... )를 통해서 특정 범위의 부분배열을 반환받을 수 있습니다. 현재 값은 [5, 2, 6, 3] 입니다. 

 

또한 해당 부분 배열을 sorted() 메서드를 사용해 바로 정렬할 수 도 있습니다. 그 부분을 이어서 보겠습니다.

이때 범위지정자를 통해 반환받은 부분배열은 [Int](Array<Int>) 타입이 아닌, Array.SubSequence(ArraySlice<Int>) 타입입니다. 

 

 

프로그래머스 K번째 수 문제풀이3
프로그래머스 K번쌔수 swift 문제풀이 코드3

[5, 2, 6, 3]에서 sorted() 메서드를 이어 붙여 사용합니다. sorted()는 기본적으로 오름차순 정렬을 해줍니다.

 

그 결과는 [2, 3, 5, 6]이며, 반환값은 Int타입 배열인 [Int]가 됩니다. 이제 이 상태에서 첨자접근을 통해 K번째 수를 구하면 끝이지요!

sortedSubArray 아래의 kNumber에 들어가는 결과값이 바로 하나의 1차원 배열에 대한 값입니다.

 

 

다시한번 말씀 드리지만, 배열의 인덱스는 0부터 시작하므로, -1 처리를 해서 첨자접근을 합니다.

 

 

프로그래머스 K번째 수 문제풀이 4
프로그래머스 K번쌔수 swift 문제풀이 코드4

commands에서 접근해서 사용한 map은 배열에서 사용가능한 매핑에 사용하는 메서드(클로져, 고차함수)입니다.

map 연산은 현재 배열의 값을 특정 조건에 따라 매핑해줍니다. 그리고 해당 블럭 내의 $0는 commands에 있는 각각의 1차원 배열이라고 생각하시면 됩니다.

 

그렇게 보면 위에서 했던 map 매핑 작업은 commands 내에 있는 각 1차원 배열에대한 연산결과로 매핑해서 answer에 반환한다는 것을 이해하실 수있습니다. 


해당 코드가 이해가 가시나요? 해당 코드는 위에서 했던 과정을 commands 2차원배열에있는 각 1차원 배열마다 반복해서 수행하는 것입니다. 

 

요약하자면, "commands 2차원 배열 내의 각 1차월 배열에 대해서 i-1 ~ j-1 범위의 값을 정렬 후, k번째 값을 구한 뒤 1차월 배열을 해당 k번째 값으로 매핑하라!!" 라고 할 수 있겠습니다. 🤗 

 

네, 이렇게 답을 구했습니다. 왜냐하면, 프로그래머스 페이지의 문제풀이 화면에서 요구하는 것이 바로 이 코드이기 때문입니다. 바로 적용한 화면을 보시겠습니다. 

 

 

 

프로그래머스 K번째 수 문제풀이 5
프로그래머스 K번쌔수 swift 문제풀이 결과


이렇게 단 한 줄(?)의 스위프트(swift) 코드로 프로그래머스의 알고리즘문제, K먼제 수 문제를 풀 수 있게 되었습니다. 🤗

 

 

 


함수형 패러다임을 채택하고 있는 멀티패러다임언어, 스위프트에서 이러한 메서드(클로져, 고차함수)의 사용은 매우 유용하고 간결한 코드를 작성할 수 있는 강력한 무기가 될 수 있습니다. 

 

만약 위의 코드가 이해가지 않는다면, 개인적으로 플레이그라운드에서 코드를 작성해보며 타입의 변화과정, 값의 도출과정을 확인해보시기 바랍니다. 그럼 이만, 즐거운 하루 되세요~ 👩🏻‍💻

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함