본문 바로가기
알고리즘 문제풀이

[프로그래머스] #131 모의고사 (Swift)

by SiO2whocode 2022. 2. 8.
728x90

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

완전탐색

학생 3명의 반복되는 답이 문제에 주어지고, 정답을 담을 배열이 인자로 주어지면
학생들 중 가장 높은 점수를 획득한 학생들을 결과로 반환하는 문제

접근방법

학생들의 답을 담은 배열과 정답 배열을 순회하면서 일일이 비교하여
학생들 각각의 점수를 구한 뒤 최고점과 점수가 같은 학생들을 결과 배열에 담아, 오름차순으로 정렬하여 반환하는 식으로 풀이했다.

처음에는 학생들의 점수를 배열에 담아서 풀이했지만,
다른 사람의 풀이를 참고하니 딕셔너리를 사용하는 것이 훨씬 코드와 로직이 깔끔했다.

딕셔너리를 사용하고 고차함수(filter, map)을 써서 결과를 반환하는 것으로 코드를 개선했다.
+그리고 for-in 문에서 index를 사용하고 싶을 때 배열.enumerated()를 써서 사용했다.

소스코드 (개선 전)

import Foundation

func getScore(_ answers:[Int], _ rAnswers: [Int]) -> Int {
    let size: Int = answers.count
    var i: Int = 0
    var score: Int = 0
    
    for ra in rAnswers {
        if ra == answers[i] {
            score += 1
        }
        i = (i+1) % size
    }
    
    return score
}

func solution(_ answers:[Int]) -> [Int] {
    var result: [Int] = []
    var max: Int
    var scores: [Int] = []
    let students: [[Int]] = [
        [1,2,3,4,5],
        [2,1,2,3,2,4,2,5],
        [3,3,1,1,2,2,4,4,5,5]
    ]
    
    
    for student in students {
        scores.append(getScore(student, answers))
    }
    
    max = scores.max()!
    scores.enumerated().forEach {
        if max == $0.element {
            result.append($0.offset + 1)
        }
    }
    
    return result
}

소스코드 (개선 후)

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    var scores: [Int:Int] = [1:0, 2:0, 3:0]
    let students: [[Int]] = [
        [1,2,3,4,5],
        [2,1,2,3,2,4,2,5],
        [3,3,1,1,2,2,4,4,5,5]
    ]
    
    for (i,v) in answers.enumerated() {
        if students[0][i % 5] == v { scores[1] = scores[1]!+1 }
        if students[1][i % 8] == v { scores[2] = scores[2]!+1 }
        if students[2][i % 10] == v { scores[3] = scores[3]!+1 }
    }
    
    
    return scores.filter{ $0.value == scores.values.max() }.map{ $0.key }.sorted()
}
728x90