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

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

by SiO2whocode 2022. 2. 16.
728x90

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

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

구현 level 1

1부터 45까지의 수를 중복없이 6개가 나열된 로또 번호가 2개 주어진다. (배열 2개, 중복없음은 하나의 로또 번호안에서만 해당)

하나는 민우의 손상된 로또 번호로, 0으로 표시된 수가 손상된 수이다.

다른 하나는 당첨 번호를 담은 로또이다. 

이때, 민우가 가진 로또가 될 수 있는 최고 순위와 최저 순위를 구하여 순서대로 배열에 담아 반환하는 문제.

 

접근방법

당첨번호와 일치하는 수의 개수에 따른 로또 순위가 표로 주어져서 딕셔너리를 이용해서 맵핑시켰다. (scoreRankMap)

중복이 없으므로 민우가 가진 번호 중 0이 아닌 수는 당첨 번호에 있는지 확인하여 있다면, 당첨 번호화 일치하는 수의 개수를 담은 변수(correctCount)값을 1 증가 시켰다.

가진 번호가 0이면 불분명한 수의 개수를 담은 변수(unclearCount)값을 1 증가 시켰다.

 

이미 일치하는 수의 개수가 민우가 맞출 수 있었던 최소 개수이므로 이에 해당하는 순위가 최저순위,

일치하는 수와 불분명한 수를 합한 개수가 맞출 수 있던 최대 개수이므로 이에 해당하는 순위가 최고순위.

 

각각 개수를 딕셔너리 키로 사용하여 값을 결과로 반환했다.

 

소스코드

풀이1

forEach 활용 풀이

import Foundation

func solution1(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {

    let scoreRankMap: [Int:Int] = [0:6, 1:6, 2:5, 3:4, 4:3, 5:2, 6:1]
    var correctCount: Int = 0
    var unclearCount: Int = 0

    lottos.forEach{
        if $0 == 0 { unclearCount += 1 }
        else if win_nums.contains($0) { correctCount += 1 }
    }

    let lowestRank = scoreRankMap[correctCount] ?? 0
    let highestRank = scoreRankMap[correctCount + unclearCount] ?? 0

    return [highestRank, lowestRank]
}

풀이2

고차함수를 사용한 풀이 (시간 효율성 떨어짐)

import Foundation

func solution2(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    
    let scoreRankMap: [Int:Int] = [0:6, 1:6, 2:5, 3:4, 4:3, 5:2, 6:1]
    var correctCount: Int = lottos.filter{ win_nums.contains($0) }.count
    var unclearCount: Int = lottos.filter{ $0 == 0 }.count
    
    let highestRank = scoreRankMap[correctCount + unclearCount] ?? 0
    let lowestRank = scoreRankMap[correctCount] ?? 0

    return [highestRank, lowestRank]
}
728x90