Algorithm/Swift

[Programmers] 로또의 최고 순위와 최저 순위 (Swift)

Minny27 2021. 7. 10. 01:10

문제 : 

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

 

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

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

programmers.co.kr

 

1. 문제 이해하기

  • 로또는 총 1~ 45까지의 숫자 중 6개 찍어서 맞추는 방식
  • 로또 당첨 숫자(win_nums), 내가 찍은 숫자(lottos)가 주어졌을 때, 당첨 내용에 부합할 수 있는 가장 높은 순위와 낮은 순위를 배열로 출력
  • 알아볼 수 없는 숫자(0)가 존재

 

2. 문제 풀이 생각하기

  1. 먼저 0이 아닌 로또를 찍은 모든 숫자를 당첨 숫자와 비교해서 맞은 개수를 저장합니다.
  2. 그와 동시에 0의 개수도 셉니다. 그 이유는 당첨 순위의 최대 , 최소만 구하면 되기 때문에 0을 모두 맞은 것으로 처리하거나, 다 틀린 것으로 간주하기 위함입니다.
  3. 당첨 개수가 6개이기 때문에 해시 테이블을 이용해서 [맞은 번호 개수 : 순위] 형태로 저장하고, 맞은 번호 개수의 해당하는 순위를 각각 maxValue, minValue에 저장해서 출력합니다.
  4. 여기서 maxValue = 맞은 개수 + 0의 개수, minValue = 맞은 개수로 최대, 최소를 출력할 수 있습니다.

 

3. 차근차근 구현하기

import Foundation

func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    var winCount = 0
    var zeroCount = 0
    var maxValue = 0
    var minValue = Int.max
    // [맞은 번호 개수 : 순위]
    let ht : [Int : Int] = [6 : 1, 5 : 2, 4 : 3, 3 : 4, 2 : 5, 1 : 6, 0 : 6]
    
    for lotto in lottos {
        if lotto == 0 {
            zeroCount += 1
            continue
        }
        for winNum in win_nums {
            if lotto == winNum {
                winCount += 1   
            }
        }
    }
    maxValue = ht[winCount + zeroCount]!
    minValue = ht[winCount]!
    return [maxValue, minValue]
}

 

4. 피드백

  • 구현실력이 점점 늘고 있는 것 같습니다.