본문 바로가기

Mobile/Swift

[코딩테스트 입문] Swift - Day 3

반응형


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

 

반응형