본문 바로가기
스터디(programmers)

Kotlin] 프로그래머스 Lv.2, 할인 행사

by 김마리님 2023. 4. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/131127

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

더보기

사실 이번 문제 풀이는 마음에 안 드는데 남들 풀이 봐도 다들 비슷하게 한 거 같음.. 어쩔 수 없는 이중반복문 문제인듯.

 

다만 여기서 생각해야할 건, 효율을 많이 먹지 않기 위해 (discount가 최대 10만개임) 중간에 루프를 끊어줄 수 있어야 하는게 관건인듯.

모든 것이 할인받아야 한다는 것은 다시 말해서 하나라도 기간 내에 전체 할인을 받을 수 없다면 필요가 없다는 말이다.

그래서, 10일 내의 할인 목록을 출력하고, 그 할인 목록 내에서의 수량을 count로 확인하고 갯수와 일치하지 않는다면 다음 일자의 루프를 확인한다. 이중 포문이라 어쩔수 없음.

 

*+ forEach, forEachIndex의 경우 coutinue와 break를 쓸 수 없다.

루프에 @blabla를 통해 이름을 부여하고, 해당 루프를 return 시키면 coutinue처럼 쓸 수 있다.

루프를 완전 종료 시키고 싶다면, 해당 루프를 run { }으로 감싼 후, run에도 이름을 부여한 후, 해당 run을 break시키면 된다.

 

class Solution {
    fun solution(want: Array<String>, number: IntArray, discount: Array<String>): Int {
        var answer: Int = 0

        discount.forEachIndexed discountLoop@{ index, _ ->
            var endDiscount = if (index + 10 <= discount.size) {
                // 10개를 세려면 9개를 더해야함.
                index + 9
            } else {
                discount.size - 1
            }

            var list = discount.slice(index .. endDiscount)

            want.forEachIndexed { wantIndex, s ->
                if(list.count { it == s } != number[wantIndex]) {
                    // 수량 안 맞으면 어차피 이 기간에 회원가입을 못함. 보자마자 할인 루프 종료
                    return@discountLoop
                }
            }

            answer += 1
        }


        return answer
    }
}
반응형