iOS 개발일기

[Swift] 프로그래머스(위클리 챌린지 2주차) - 상호 평가 본문

코딩테스트

[Swift] 프로그래머스(위클리 챌린지 2주차) - 상호 평가

맨날 까먹으니 적어두자 2021. 8. 18. 17:50

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

 

코딩테스트 연습 - 2주차

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

 

나의 풀이

func solution(_ score: [[Int]]) -> String {
    var result = ""
    
    score.enumerated().forEach { (x, line) in
        var score = [Int]()
        
        for y in 0..<line.count {
            score.append(scores[y][x])
        }
        
        //자신이 평가한 점수가 최대 혹은 최소 점수일 경우
        if score[x] == score.max() || score[x] == score.min() {
        
            //자신이 평가한 점수가 유일한 최대 혹은 최소 점수일 경우
            if score.filter({$0 == score[x]}).count == 1 {
                score.remove(at: x)
            }
        }
        
        //평균에 따른 등급 계산
        switch score.reduce(0, +)/score.count {
        case 90...100:
            result += "A"
        case 80..<90:
            result += "B"
        case 70..<80:
            result += "C"
        case 50..<70:
            result += "D"
        default:
            result += "F"
        }
    }

    return result
}

 

가독성을 고려한 풀이

func solution(_ scores: [[Int]]) -> String {
    var result = ""

    scores.enumerated().forEach { (x, line) in 
        var score = [Int]()
        
        for y in 0..<line.count {
            score.append(scores[y][x])
        }
    
        let myScore = score[x] //자신이 평가한 점수
        let max = score.max()  //최대값
        let min = score.min()  //최소값
        
        //자신이 평가한 점수가 최대 혹은 최소 점수일 경우
        if myScore == max || myScore == min {
            
            var count = 0
            
            //자신이 평가한 점수와 동일한 최대 혹은 최소 점수가 있는지 확인
            score.enumerated().forEach { (i, value) in
                guard score[x] == value else {return}
                count += 1
            }
            
            //자신이 평가한 점수와 동일한 점수가 없다면 삭제
            if count == 1 {
                score.remove(at: x)
            }
        }
        
        //평균에 따른 등급 계산
        let avg = score.reduce(0, +)/score.count
        switch avg {
        case 90...100:
            result += "A"
        case 80..<90:
            result += "B"
        case 70..<80:
            result += "C"
        case 50..<70:
            result += "D"
        default:
            result += "F"
        }
    }

    return result
}

 

이렇게 두 가지의 풀이를 생각한 다음 테스트를 해보았는데

filter() 함수를 사용한 풀이가 for문을 사용한 풀이보다 전반적으로 완료 시간이 늦었다.

 

이유를 찾아봐야겠다.