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

Elen li·2022년 8월 14일
0

프로그래머스 문제 보러가기

내 코드

class Solution {
     fun solution(lottos: IntArray, win_nums: IntArray): IntArray {
        var answer: IntArray = intArrayOf()
        val listOfAnswer: MutableList<Int> = answer.toMutableList()
        
        var correctCount = 0
        var unreconizableCount = 0
        
        // 1번 
        lottos.forEach{
            i -> 
            if(win_nums.contains(i)) {
                correctCount++
            } else if (i == 0) {
                unreconizableCount++
            }
         }
        
        // ------------ 3번 시작
        if(correctCount == win_nums.size) {
            listOfAnswer.add(1)
            listOfAnswer.add(1)
            
            return listOfAnswer.toIntArray()
        } 
        
        if(unreconizableCount == win_nums.size) {
            listOfAnswer.add(1)
            listOfAnswer.add(6)
            
            return listOfAnswer.toIntArray()
        }
        // ------------ 3번 끝
    
        when(correctCount) {
            2 -> listOfAnswer.add(5)
            3 -> listOfAnswer.add(4)
            4 -> listOfAnswer.add(3)
            5 -> listOfAnswer.add(2)
            6 -> listOfAnswer.add(1)
            else -> listOfAnswer.add(6)
        }


        when(correctCount + unreconizableCount) {
            2 -> listOfAnswer.add(5)
            3 -> listOfAnswer.add(4)
            4 -> listOfAnswer.add(3)
            5 -> listOfAnswer.add(2)
            6 -> if(unreconizableCount == 6) listOfAnswer.add(6) else listOfAnswer.add(1)
            else -> listOfAnswer.add(6)
        }
        
        if(listOfAnswer.last() < listOfAnswer.first()) {
            return swapAscValue(listOfAnswer).toIntArray()
        }
        
        
        return listOfAnswer.toIntArray()
    }
     
    fun swapAscValue(listOfAnswer: MutableList<Int>): MutableList<Int> {
        var first = listOfAnswer.first()
        listOfAnswer[0] = listOfAnswer.last()
        listOfAnswer[1] = first
        
        return listOfAnswer
    }
}

나랑 그나마 비슷한 생각으로 푼거같은 코드랑 비교를 해봤다.

  1. when ~ else 문을 2개로 나눠서 구해서 코드가 길어짐
    • 맞은 개수에 따른 등수는 같음 -> 하나의 함수로 떼어내고 맞은 개수는 파라미터로 받았어야 함
//hslim님 코드 참고
fun checkGrade(v:Int):Int{
     return when(v){
         6 -> 1
         5 -> 2
         4 -> 3
         3 -> 4
         2 -> 5
         else -> 6
     }
}
  1. 각각의 맞은 개수에 따라 list에 값을 add한 것
    • 많이 맞을 수록 등수는 높아짐(1등) -> correctCount + unreconizableCount
    • 적게 맞을 수록 등수는 낮아짐(6등) -> correctCount의 값 add
      이 결과값들만 리스트에 Add했으면 마지막에 swap을 해야할 필요가 없었다.
//hslim님 코드 참고
listOfAnswer.add(checkGrade(correctCount + unreconizableCount))
listOfAnswer.add(checkGrade(correctCount))
  1. 사실 여기 코드는 딱히 필요하진 않았음.
    채점에서 에러가 나는걸 보고 에러가 나는 경우의 수를 줄여보고자 만들었던 코드였다.
    1번으로 제대로 수정해놓으면 삭제해도 무방함.

++ 가장 좋아요를 많이 받은 코드(홍희표님)를 보니 정말 대단쓰...ㅎㅎ

  1. '7 - 맞은 개수 = 등수' 생각 못함
  2. '가장 높은 등수 = winNums.contains(it) || it == 0' 임을 인지 못함 ㅎ
  3. '가장 낮은 등수 = lottos.filter(winNums::contains).size'임도 인지 못함
  4. 이런걸 생각 못했는데 마지막에 map으로 예외사항 정리는 당연히 생각도 못함 ㅋㅋ

설령 filter를 썼다해도 lotos.filter(winNums::contains)로 못했겠지...
재밌다

profile
Android, Flutter 앱 개발자입니다.

0개의 댓글