[프로그래머스(LV1)]로또의 최고 순위와 최저 순위

문제설명

0이상 45이하인 6개의 정수를 입력받고 당첨 번호와 비교하여 등수를 출력.
이때 알아볼 수 없는 번호를 0으로 두어 최저 등수와 최고 등수를 출력해야 함.
예시)


내가 작성한 코드

import Foundation

var zeroCount: Int = 0
var numCount: Int = 0
var high: Int = 0 
var low: Int = 0
var resultHigh: Int = 0
var resultLow: Int = 0

func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    
    
    for i in 0...5{
        for j in 0...5{
            if lottos[i] == 0{
                zeroCount += 1
                break
            } else {
                if lottos[i] == win_nums[j]{
                    numCount += 1
                }
            }
        }
    }
    
    high = numCount + zeroCount
    low = numCount
    
    switch high {
    case 6:
        resultHigh = 1
    case 5:
        resultHigh = 2
    case 4:
        resultHigh = 3
    case 3:
        resultHigh = 4
    case 2:
        resultHigh = 5
    default:
        resultHigh = 6
    }
    
    switch low {
    case 6:
        resultLow = 1
    case 5:
        resultLow = 2
    case 4:
        resultLow = 3
    case 3:
        resultLow = 4
    case 2:
        resultLow = 5
    default:
        resultLow = 6
    }
    
    return [resultHigh, resultLow]
}

한 눈에 봐도 굉장히 지저분한 코드였다. 반복문을 이용하여 두 배열을 차례대로 모두 비교하였다. 답안을 제출 후 다른 분들의 답을 보고 코드의 효율성을 올리기위해서는 많이 배워야겠다는 생각이 들었다.

수정한 코드

import Foundation


func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    
    let zeroCount = lottos.filter{$0 == 0}.count
    let winCount = win_nums.filter{lottos.contains($0)}.count
    return [min(7-zeroCount-winCount, 6), min(7-winCount, 6)]
}

눈에 띄게 짧아진 것을 볼 수 있다. filter를 이용하여 lottos 배열 안에 0이 몇개 있는지 알아내었고, 마찬가지로 lottos 배열 안 값이 win_nums배열 안에 몇개가 포함되는지 알아내어 최고, 최저 등수를 구했다. 이때 7-zeroCount-winCount나 7-winCount의 식이 7이 될 수도 있기 때문에 가장 낮은 등수 6과 비교하여 구해주었다.


filter

단어 뜻 그대로 내부 값을 걸러서 추출한다. 예를 들어

let x = [1, 2, 3, 4, 5]
var y = x.filter{$0 < 5}

위와 같은 코드가 있다면 y의 출력값은 1, 2, 3, 4가 될 것이다.


작성한 두 코드를 비교해보면 딱 봐도 가독성의 차이가 크다. 더 공부하여 점점 발전시키겠다.


로또의 최고 순위와 최저 순위

좋은 웹페이지 즐겨찾기