오늘은 그리디 알고리즘 문제 중 하나인 백준 10162번 전자레인지 문제를 풀어봤다.
문제 링크는 아래와 같다.
이 문제의 핵심은 가장 큰 시간부터 입력받은 수에서 뺄셈을 통해 최소 개수를 구하는 방법이다.
만약, 제일 큰 수에서부터 계속 뺄셈을 진행하다 0보다 작아지면 다음 수를 빼보고 이 과정을 반복해서
끝에 0과 같거나 0보다 작을 경우를 판별해 최소 개수를 출력 또는 -1을 출력함으로써 답을 구할 수 있다.
코드는 아래와 같다.
주석을 참고해 문제를 해결해보자.
fun main(args: Array<String>) {
var (a,b,c) = arrayOf(300,60,10) // 각 시간 저장 변수 a,b,c
var (count1,count2,count3) = arrayOf(0,0,0) // 각 버튼 클릭 횟수 c1,c2,c3
var inputNum = readln().toInt() // 시간 입력 받기
while (true){
if (inputNum - a >= 0){ // 5분을 뺐을때 0보다 크거나 같으면 c1 ++
inputNum -= a
count1++
}else if(inputNum - b >= 0){ // 1분을 뺐을때 0보다 크거나 같으면 c2++
inputNum -= b
count2++
}else if(inputNum - c >= 0){ // 10초를 뺐을때 0보다 크거나 같으면 c3++
inputNum -= c
count3++
}else{
if (inputNum == 0){// 올바르게 최소 조작 버튼 값이 구해졌을때
println("$count1 $count2 $count3") // 최소 조작 버튼 개수 출력
break
}else{ // 올바르지 않게 구해졌을때
println(-1) // -1 출력
break
}
}
}
}