[Algorithm] 프로그래머스 모의고사

Updated:

문제 설명

9

나의 풀이

import Foundation
let firstPerson = [1,2,3,4,5]
let secondPerson = [2,1,2,3,2,4,2,5]
let thirdPerson = [3,3,1,1,2,2,4,4,5,5]

func solution(_ answers:[Int]) -> [Int] {
    var countFirstPerson = 0
    var countSecondPerson = 0
    var countThirdPerson = 0
    
    for (index, answer) in answers.enumerated() {
        if compareFirstPersonAnswer(index: index, answer: answer) {
            countFirstPerson += 1
        }
        if compareSecondPersonAnswer(index: index, answer: answer) {
            countSecondPerson += 1
        }
        if compareThirdPersonAnswer(index: index, answer: answer) {
            countThirdPerson += 1
        }
    }
    
    var answer = [1: countFirstPerson, 2: countSecondPerson, 3: countThirdPerson]
    let sortedAnswer = answer.sorted { $0.1 > $1.1 }
    
    if sortedAnswer[0].value > sortedAnswer[1].value {
        return [sortedAnswer[0].key]
    } else if sortedAnswer[1].value > sortedAnswer[2].value {
        if sortedAnswer[0].key < sortedAnswer[1].key {
            return [sortedAnswer[0].key, sortedAnswer[1].key]
        }
        return [sortedAnswer[1].key, sortedAnswer[0].key]
    } else {
        return [1,2,3]
    }
}

func compareFirstPersonAnswer(index: Int, answer: Int) -> Bool {    
    if answer == firstPerson[index % 5] { return true }
    return false
} 
func compareSecondPersonAnswer(index: Int, answer: Int) -> Bool {
    if answer == secondPerson[index % 8] { return true }
    return false
} 
func compareThirdPersonAnswer(index: Int, answer: Int) -> Bool {
    if answer == thirdPerson[index % 10] { return true }
    return false
}

고민한 점

Swift 딕셔너리 정렬은 다음과 같이 사용할 수 있다.

let dic = [1: 10, 2: 50, 3: 20]
// 값을 기준으로 오름 차순 정렬
let valueSortedDic = dic.sorted { $0.value < $1.value } // { $0.1 < $1.1 }
// [(key: 1, value: 10), (key: 3, value: 20), (key: 2, value: 50)] 

// 키를 기준으로 내림 차순 정렬
let keySortedDic = dic.sorted { $0.key > $1.key } // { $0.0 > $1.0 }
// [(key: 3, value: 20), (key: 2, value: 50), (key: 1, value: 10)]

괜찮은 남의 풀의

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    let answer = (
        a: [1, 2, 3, 4, 5], // index % 5
        b: [2, 1, 2, 3, 2, 4, 2, 5], // index % 8
        c: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] // index % 10
    )
    var point = [1:0, 2:0, 3:0]

    for (i, v) in answers.enumerated() {
        if v == answer.a[i % 5] { point[1] = point[1]! + 1 }
        if v == answer.b[i % 8] { point[2] = point[2]! + 1 }
        if v == answer.c[i % 10] { point[3] = point[3]! + 1 }
    }
    // ⭐️
    return point.sorted{ $0.key < $1.key }.filter{ $0.value == point.values.max() }.map{ $0.key }
}

다른 곳이야 다 비슷한데 ⭐️ 비교해서 출력하는 부분을 정리하면 다음과 같다.

  1. 키 값을 오름차순으로 정렬 (sorted)
  2. 3명의 점수를 채점한 것에서 max 값이랑 같은 값들을 걸러냄 (filter)
  3. 걸러낸 것들의 키 값을 담음 (map)

참고

Programmers

Leave a comment