Q. 정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.
func solution(_ num1:Int, _ num2:Int) -> Int { num1 % num2 }
Q. 중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.
- array의 길이는 홀수입니다.
- 0 < array의 길이 < 100
- -1,000 < array의 원소 < 1,000
func solution(_ array:[Int]) -> Int { array.sorted()[array.count/2] }
Q. 최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다. (+6)
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
func solution(_ array: [Int]) -> Int {
// 첫번째 경우의 수인 배열의 길이가 1인 경우를 제외
if array.count == 1 { return array[0] }
// 배열을 Set로 중복된 값을 없애고, 정렬 후 다시 배열로 변경
var uniqueArray = Array(Set(array)).sorted()
// 고차함수인 map과 filter를 이용해서 uniqueArray의 각 요소들의
// 수를 확인
// newArray: uniqueArray 요소들의 수가 담긴 배열
var newArray = uniqueArray.map{ (number: Int) -> Int in
return array.filter {$0 == number}.count
}
// countOfMaxValue는 동일한 개수가 담긴 경우를 제외하기 위해 확인
var countOfMaxValue = newArray.map {$0 == newArray.max()}.filter{ $0 == true }.count
if countOfMaxValue >= 2 { return -1 }
// newArray의 최댓값을 이용해 newArray에서 Index를 구하고,
// uniqueArray에서 해당 인덱스에 있는 값을 반환
return uniqueArray[newArray.firstIndex(of: newArray.max()!)!]
}
최대한 고차함수를 많이 써보려고 했다. map과 filter, reduce에 익숙해져야 할 거 같았기 때문이다. 하지만 옵셔널 값이 나와 코드가 지저분해지는 느낌을 받았다.
아래는 같은 문제를 다른 사람이 푼 것이다.
func solution(_ array: [Int]) -> Int {
let sorted = Dictionary(grouping: array) { $0 }.sorted { $0.value.count > $1.value.count }
return sorted.count > 1 && sorted[0].value.count == sorted[1].value.count ? -1 : sorted[0].key
}
길고 지저분한 내 코드와는 다르게 정말 간결하다. Dictionary 함수로 grouping을 할 수 있었다.
var arrayInt: [Int] = [1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6]
print(Dictionary(grouping: arrayInt) { $0 })
// [5: [5, 5, 5, 5, 5], 6: [6, 6], 1: [1, 1], 2: [2], 3: [3, 3, 3], 4: [4, 4, 4]]
그 다음 배열을 정렬하는데, value인 배열의 길이가 긴 것부터 내림차순으로 정렬한다.
print(Dictionary(grouping: arrayInt) { $0 }.sorted { $0.value.count > $1.value.count })
// [(key: 5, value: [5, 5, 5, 5, 5]), (key: 4, value: [4, 4, 4]), (key: 3, value: [3, 3, 3]), (key: 1, value: [1, 1]), (key: 6, value: [6, 6]), (key: 2, value: [2])]
다음으로 경우의 수를 계산해서 값을 반환한다.
첫 번째로 정렬된 배열의 길이가 2 이상이어야 하고, 두 번째로 정렬된 배열의 첫 번째 값(value/배열)의 길이와 두 번째의 값이 길이가 같지 않아야 한다. 이 두 조건 중 하나라도 만족하지 않으면 -1을 반환하고, 둘 다 만족하는 경우 정렬된 배열의 첫 번째 키(key) 값을 반환한다.
* 다른 사람의 답과 차이가 생긴 이유: Dictionary 활용 및 매개변수로 함수를 전달하는 방식에 대한 이해가 부족했다.
Q. 정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.
func solution(_ n: Int) -> [Int] { (0...n).filter { $0 % 2 == 1 } }
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
'Mobile > Swift' 카테고리의 다른 글
[코딩테스트 입문] Swift - Day 5 (0) | 2022.12.23 |
---|---|
[코딩테스트 입문] Swift - Day 4 (0) | 2022.12.19 |
[코딩테스트 입문] Swift - Day 2 (0) | 2022.12.19 |
[코딩테스트 입문] Swift - Day 1 (0) | 2022.12.19 |
[Swift - 문법] 프로퍼티(Property) - 3. 타입 프로퍼티 (0) | 2022.11.14 |