[프로그래머스] 로또의 최고 순위와 최저 순위

neoneoneo·2024년 3월 15일
0

kotlin

목록 보기
35/49

문제

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

요약 | 로또를 샀는데 동생이 낙서해놨다! 알아볼 수 없는 번호가 당첨 번호라면 최고, 최저 순위를 구하시오.

코드 쓰기 전 풀이

최저 : 0 제외한 것들 중 매칭 되는 개수로 판단 가능
최고 : 최저 등수와 0 개수로 판단 가능 (0 자리에는 매칭 값만 넣는 가정을 해도 되기 때문)

예)
[당첨 번호] 1 2 3 4 5 6
[나의 번호] 0 0 3 4 5 6
-> 최저 : 4개는 매칭(3등)
-> 최고 : 0 자리가 1, 2일 경우 6개 매칭(1등)

나의 풀이 git

//메모리: 63 MB, 시간: 13.67 ms
class Solution {
    fun solution(lottos: IntArray, win_nums: IntArray): IntArray {
        var zeros = 0; var lowest = 7; var highest = 7      
        lottos.forEach { lotto ->
            win_nums.forEach { winNum ->
                if (lotto == winNum) {
                    lowest--
                }
            }
            if (lotto == 0) zeros++
        }               
        highest = lowest - zeros
        if(highest == 7) highest--
        if(lowest == 7) lowest--        
        return intArrayOf(highest, lowest)
    }
}
  • 나의 번호(lottos)를 하나씩 돌면서 당첨 번호(win_nums)와 일치하는지 확인한다.
  • 일치할 경우 lowest에 역적립(?) 해두어 최소 순위 값을 저장 또는 갱신한다.
  • 또한 나의 번호가 알아 볼 수 없는 번호(0)이면 별도로 그 개수를 zeros에 저장해둔다.
  • 매칭 되는 숫자 개수가 하나 늘어나면 순위도 하나 올라가므로, highest는 lowest 순위에 0의 개수를 빼는 식으로 구한다.
  • lowest, highest를 7에서부터 빼고 있으며, 나의 번호와 당첨 번호 중 아무 숫자도 매칭이 되지 않는 케이스가 있을 수 있으므로 저 두 변수를 7로 두지 않는다(6으로 만든다.)

고수의 풀이

이번 고수의 풀이는 swift를 이용한 풀이인데, kotlin과 문법이 거의 일치한다. filter와 min만으로 풀어낸 부분이 아주 천재 같다.

import Foundation
func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
    let zeroCount = lottos.filter { $0 == 0}.count
    let winCount: Int = win_nums.filter { lottos.contains($0) }.count
    return [min(7-winCount-zeroCount,6), min(7-winCount,6)]
}
  • filter로 0의 개수를 구해 놓는다. (최고 순위 계산에 사용)
  • filter로 매칭되는 숫자 개수를 구해 놓는다. (최저, 최고 순위 계산에 사용)
  • min으로 아무 숫자도 매칭되지 않을 경우에는 6을 아니면 계산된 최저, 최고 값을 판별하여 최종적으로 반환한다.

느낀점

  • 문제를 언뜻 봤을 때, filter를 쓸 수 있으려나 했는데 막상 실제로 적용해보지는 못 했다. 고수는 그것에 더해 min을 if문 대신으로 써 코드를 더 간결하게 작성했다. 봤을 때 정말 감탄했다.
  • 이번 고수의 사례에서도 filter의 용례를 살펴봤다. 다음에는 진짜 내 코드에도 filter를 멋지게 써보고싶다.

[TIL-240315]

0개의 댓글