본문 바로가기

알고리즘(w.KOTLIN)/자료구조

[알고리즘][KOTLIN] 롤케이크 자르기

728x90

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. topping 배열을 copyOfRange 를 이용하여 두 가지 Set 으로 나누어 서로의 크기가 같은 지 비교해서 결과를 구할 경우 첫 번째 케이스를 제외하고는 시간 초과가 발생한다.

2. 시간 초과가 발생하지 않기 위해서 for loop 를 한 번만 수행해야 한다.

3. loop 를 한 번만 수행하면서 철수와 동생의 토핑 종류 개수를 비교하는 로직을 구현 한다.

    3-1. 입력의 topping 은 A(철수) Map(Int, Int) 에 저장한다. 이때 Key 는 토핑의 종류이고 Value 는 Key 에 해당하는 토핑의 개수이다.

    3-2. topping 배열을 하나씩 탐색한다.

    3-3. topping 이 Map A 에 있으면 개수를 하나 빼고 Map A의 개수가 1개 이면 Remove 한다.

    3-4. B(동생) Map 에 A 와 같은 형태로 저장한다.

    3-5. A와 B Map 의 크기가 같으면 answer 를 증가한다.

4. 결과를 출력한다.

코드

class Solution {
    fun solution(topping: IntArray): Int {
        var answer: Int = 0
        
        val A = mutableMapOf<Int, Int>()
        val B = mutableMapOf<Int, Int>()
        
        topping.forEach { t ->
            if (A.containsKey(t)) {
                A[t]?.let {
                    A[t] = it + 1    
                }
            } else {
                A[t] = 1
            }
        }
        
        topping.forEach { t ->
            if (A.containsKey(t)) {
                A[t]?.let { a ->
                    if (a > 1) {
                        A[t] = a - 1
                    } else {
                        A.remove(t)
                    }
                }
            }
            
            if (B.containsKey(t)) {
                B[t]?.let {
                    B[t] = it + 1    
                }
            } else {
                B[t] = 1
            }
            
            if (A.size == B.size) answer++
        }
        
        return answer
    }
}
728x90