Programmers Scala Study (level 1.1)

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

문제 설명

로또는 45개의 숫자에서 6개를 뽑아 몇개가 일치하는 지에 따라 순위를 정하는 방식의 복권이다.

eg.

순위 당첨 내용
1 6개 숫자 모두 일치
2 5개 숫자가 일치
3 4개의 숫자가 일치
4 3개의 숫자가 일치
5 2개의 숫자가 일치
6(Fail) 1개 혹은 0개의 숫자가 일치

문제상황에서 동생이 자신의 로또 일부분에 낙서를 해서 못 알아보게 되었다고 한다.

(알아볼수 없는 숫자는 0으로 표시되어 있다.)

그래서 알아볼수 있는 숫자들로 자신의 최고 점수와 최저 점수를 알아보려고 한다.

inputs

Variable Name Type Meaning
lottos (array) Vector[Int] 구매한 로또의 숫자들
win_nums (array) Vector[Int] 당첨 번호들

output

return Vector[Int, Int] // Max winning rank, Min winning rank

조건 (Condition)

  • lottos
    • length: 6
    • values: 0 ~ 45
      • 0: unrecognisable Number
      • Other than 0 cannot be repeated.
      • The array may not be sorted.
  • win_nums
    • length: 6
    • values: 1 ~ 45
    • The numbers are not repeated.
    • The array may not be sorted.
  • 일치 여부에서 순서와 상관없다

Test Cases

lottos win_nums result
[44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]
[0, 0, 0, 0, 0, 0] [38, 19, 20, 40, 15, 25] [1, 6]
[45, 4, 35, 20, 3, 9] [20, 9, 3, 45, 4, 35] [1, 1]

Solution

최저 점수는 알아볼수 없는 숫자도 틀렸다고 가정. → 알아볼수 있는 숫자들로만 매칭된 개수 확인

최고 점수는 알아볼수 없는 숫자들도 모두 맞췄다고 가정 → 최저 점수 매칭 + 알아볼수 없는 숫자

Study from Implementation

  • How to check “num in array”

파이썬은 A in B_list 하면 B_list에 A가 있는 지를 Bool로 알려준다. 스칼라는 어떻게 해야하나

Vector에 exists라는 함수가 있다. 파라미터로 찾을 값을 넣으면 Boolean으로 반환한다. 아래와 같은 형태로 작성하면 된다.

win_nums.exists(v => v == 31)

각 값의 존재 여부를 map함수랑 위에서 알게된 exist함수를 엮어서 짜보자

win_nums.map(num => lottos.exists(lotto => lotto == num))

final solution code

0개와 1개 매칭을 하나로 묶어야해서 조건문을 추가했다.

def solution(lottos: Vector[Int], win_nums: Vector[Int]): Vector[Int] = {
        var unknown_count = lottos.count(_ == 0)
        var match_count = win_nums.map(num => lottos.exists(lotto => lotto == num))
                                  .count(_ == true)
        
        var max_rank = if ((unknown_count+match_count) == 0) 6 else 7-(unknown_count+match_count)
        var min_rank = if (match_count == 0) 6 else 7-(match_count)
        
        return Vector[Int](max_rank, min_rank)
    }