알고리즘(w.KOTLIN)/자료구조
[알고리즘][KOTLIN] 롤케이크 자르기
금님은님아부지
2022. 12. 3. 09:43
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