본문 바로가기
Algorithm

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

by Jiseong 2021. 9. 24.

 

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

 

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

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

programmers.co.kr

 

제한사항

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

 

 

 

//
//  main.swift
//  Programmers_로또최고최저순위
//
//  Created by 임지성 on 2021/09/24.
//

import Foundation

func solution(_ lottos: [Int], _ win_nums: [Int]) -> [Int] {
    let zeroCount = lottos.filter({ $0 == 0 }).count
    //filter 함수를 사용하여 $0에 lottos 값 iteration, 0과 일치하는 횟수 저장
    let winCount = lottos.filter({ win_nums.contains($0) }).count
    //win_nums와 일치하는 수의 갯수 저장
    //win_nums는 0을 제외한 lottos와의 일치 횟수 (win_nums는 0이 올수 없음(제한 사항))
    
    return [winCount+zeroCount, winCount].map({ $0 <= 1 ? 6 : 7 - $0 })
    
}


//print(solution([44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19]))

 

 

고차함수 사용

0은 낙서로 가려진 수 이므로 무슨 수가 올지 모름 = 어떠한 수든 올 수 있음 = 당첨일 수도 아닐 수도 있다는 것

최고등수와 최저등수를 도출하는 것이기에, 낙서로 가려져 모르는 수 0의 갯수를 결과값에 추가하는 식

filter 함수를 사용하여 $0에 lottos 값 iteration, 0과 일치하는 횟수 저장

contains 함수로 lottos 값이 포함되어있는지 순회하며 확인 후 일치 횟수 저장 -> 0을 제외한 일치횟수 저장 = 최저등수

최고등수는 최저등수 기준인 win_nums에 zeroCount를 더하여 일치 갯수를 매김

-> 0은 무슨 수든 올 수 있기때문에 전부 맞췄다는 가정 = 최고등수

 

조건에 0, 1개를 맞춘 로또 등수는 6등이므로 삼항연산 활용

6개 전부 맞추면 1등

5개 맞추면 2등

4개 맞추면 3등

... 2개맞추면 5등이므로 7에서 맞춘 갯수값을 빼주면 등수가 나옴

ex) 내가 기입한 로또 [44, 1, 0, 0, 31, 25]  로또 정답 [31, 10, 45, 1, 6, 19] -> 맞은 갯수 31, 1, 0, 0 (0은 무슨 수든 올 수 있으므로 정답처리) 총 4개, 7-4 = 3, 즉 3등이므로 4개맞추면 3등 조건에 부합

 

 

 

 

댓글