❓ 콜라문제
(중략)
이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.
콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.
💡 풀이
// a개의 빈 콜라병을 가져다주면 b개의 새 콜라를 줌
// 상빈이가 가지고 있는 빈 병의 개수 = n
class Solution {
// a : 마트에 주어야 하는 콜라수
// b : 돌려주는 콜라수
fun solution(a: Int, b: Int, n: Int): Int {
var answer: Int = 0 // 받을 수 있는 콜라 병 수
var newN = n
var left = 0
while(newN >= a){
answer += (newN/a) * b
left = newN % a // 돌려받은 병의 수
left += (newN/a) * b // 가져간 병의 수 * 돌려주는 병의 개수 + 이미 돌려받은 병의 수를 곱함
newN = left
}
return answer
}
}
- 상빈이가 가지고 있는 빈 병의 개수를 재사용할 수 있도록 newN으로 재선언
- newN이 마트에 주어야하는 콜라수와 같거나 클 동안만 반복문을 돌린다.
- 상빈이가 가지고 있는 병의 수를 가게에 돌려주는 병의 개수로 나눈 뒤 이미 돌려받은 병의 수를 곱한 값을 answer에 누적하여 더한다.
- 돌려받은 병의 수를 left에 할당한다.
- answer와 동일하게 left에도 누적하여 더한 뒤 left 값을 newN으로 재할당한다.
💡 다른사람의 풀이
class Solution {
fun solution(a: Int, b: Int, n: Int): Int {
return (if (n > b) n - b else 0) / (a - b) * b
}
}
반복문까지 돌려가며 복잡하게 쓴 식을 이렇게 간단하게 풀어버리다니... 수학적인 지식이 많고 알고리즘 경험이 많아야 가능할 것 같다...
상빈이 본인이신가요?
어렵지 않은 문제였지만서도 문제를 이해하고 푸는 데에 시간이 좀 걸렸다.
머리가 점점 더 말랑말랑해지는 느낌...
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 행렬의 곱셈 (Kotlin) (0) | 2024.06.20 |
---|---|
[프로그래머스] 과일 장수 (Kotlin) (0) | 2024.06.18 |
[프로그래머스] 명예의 전당 (1) (Kotlin) (2) | 2024.06.15 |
[프로그래머스] 가장 가까운 같은 글자 (Kotlin) (1) | 2024.06.15 |
[프로그래머스] 약수의 개수와 덧셈 (Kotlin) (0) | 2024.05.27 |