본문 바로가기
프로그래머스 Algorithm

[프로그래머스] 할인 행사 Kotlin

by Echung 2024. 1. 4.

thumbnail

안녕하세요. 이번에는 프로그래머스 할인 행사 문제를 풀어보려고 합니다. 

Problem


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

 

프로그래머스

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

programmers.co.kr

Solution


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

        want.forEachIndexed { i, string ->
            hashMap.put(string, number[i])
        }

        for(i in 0..discount.size - 10) {
            var check = true
            var arr = discount.sliceArray(i .. i + 9).groupBy { it }

            arr.mapKeys {
                if(hashMap.getOrDefault(it.key, 0) != it.value.size) {
                    check = false
                }
            }

            if(check) {
                answer++
            }
        }

        return answer
    }
}

 이번 문제는 hashMap을 사용해서 문제를 풀어보았습니다. 

1. hashMap을 통해서 key-value값으로 원하는 제품을 넣어줍니다.

2. discount를 10개 단위로 자르면서 groupBy를 사용해서 그룹화해 줍니다.

3. 그룹화한 값을 mapKey를 사용해서 원하는 제품들과 할인하는 것들이 일치하는지 확인하는 check 포인트를 만듭니다.

4. 모두 일치하면 check는 true를 반환해서 answer을 카운트하고 일치하지 않으면 check를 false 해주고 answer을 카운트하지 않습니다.

 

1. 다른 사람 코드

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

        for (offset in 0 until discount.size - 10 + 1) {
            val dis = discount.copyOfRange(offset, offset + 10)

            var flag = true
            for (i in want.indices) {
                val c = dis.count { it == want[i] }
                if (number[i] != c) {
                    flag = false
                    break
                }
            }

            if (flag) count++
        }

        return count
    }
}
이번 코드는 hashMap을 사용하지않고 비슷한 방법으로 문제를 접근하였습니다.

코드 분석 

1. copyOfRange를 사용해서 할인 목록을 10일 단위로 끊어줍니다.

2. count를 이용해서 원하는 물품의 개수를 파악해 줍니다. 

3. 원하는 물품의 개수(number [i])와 count의 개수가 맞는지 확인합니다.

 

제가 사용한 코드와 비슷한 코드이지만 코드의 성능과 가독성면에서 아래의 코드가 좀 더 깔끔한 것 같습니다. copyOfRange라는 함수도 처음 알게 되었습니다. 더 나은 해결법을 아시는 분은 언제든지 댓글로 남겨주시면 감사하겠습니다. 


Performance

1. 내가 작성한 코드 2. 다른 사람 코드

 

반응형