문제

1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권이 있습니다.
맞힌 개수 - 순위
6 - 1위
5 - 2위
4 - 3위
3 - 4위
2 - 5위
그 외 - 6위(낙첨)

고른 숫자중 알아볼 수 없는 숫자는 0으로 표기됩니다.

모든 0이 맞았다면 최고 점수가
모든 0이 틀렸다면 최저 점수가 나옵니다.

로또 번호를 담은 배열 : lottos
당첨 번호를 담은 배열 : win_nums
당첨 가능한 최고 순위와 최저 순위를 차례대로 담은 배열을 return하라

제한사항

  • lottos는 길이 6인 정수 배열입니다.
  • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
    • 0은 알아볼 수 없는 숫자를 의미합니다.
    • 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
    • lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  • win_nums은 길이 6인 정수 배열입니다.
  • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
    • win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
    • win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

문제 풀이

swift 문법이 궁금하던 때에 사용한 코드입니다.

import Foundation

func evaluate(n : Int) ->Int {
    if n == 6 {
        return 1
    } else if n == 5{
        return 2
    } else if n == 4{
        return 3
    } else if n == 3{
        return 4
    } else if n == 2{
        return 5
    } else {
        return 6
    }
}

func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    // set a list of final answer
    var answer = [Int]()
    
    // set an int for a number of matched numbers
    var NofMatched = 0 // NofMatched == worst case
    var NofZeros = 0
    
    for lotto in lottos {
        if lotto != 0 {
            for win_num in win_nums {
                if win_num == lotto {
                    NofMatched += 1
                }
            }
        } else { // count number of zeros in lottos
            NofZeros += 1
        }
    }
    
    let bestCase = NofMatched+NofZeros 
    answer.append(evaluate(n: bestCase))
    answer.append(evaluate(n: NofMatched))
    return answer
}

위 코드를 python3으로 바꿔서 작성해보자. 바꾸면서 개선 가능한 부분도 개선해보자.

# 매칭된 숫자의 개수(n)에 따른 순위를 return하는 함수 (개선됨)
# if,elif,else 문에 패턴이 존재합니다. return값은 7-n
def evaluate(n) :
    if n == 0 :
        return 6
    return 7-n

def solution(lottos, win_nums) :
    answer = []
    # worst case
    nOfMatched = 0
    nOfZeros = 0

    # 매칭된 개수와 Zero가 몇개인지 찾는 로직 (개선 방법이 있을 것으로 보입니다.)
    for lotto in lottos:
        if lotto != 0 :
            for win_num in win_nums:
                if win_num == lotto :
                    nOfMatched += 1
        else:
            nOfZeros += 1
    
    bestCase = nOfMatched + nOfZeros
    answer.append(evaluate(bestCase))
    answer.append(evaluate(nOfMatched))

    return answer