본문 바로가기
C#/C# : Baekjoon

[백준 - 그리디알고리즘] C# : 전자레인지 (10162번)

by TODAYCODE 2021. 7. 23.
반응형

백준 그리디 알고리즘 전자레인지 문제

 

10162번: 전자레인지

3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은

www.acmicpc.net

문제의 핵심

1. 그리디 알고리즘을 이해하고 있는가?


 

해당 문제는 그리디 알고리즘 문제 중 가장 쉬운편에 속하는 문제이다.

그리디 알고리즘을 알고 있다면 손쉽게 풀 수 있다.

 

A, B, C가 각각 5분, 1분, 10초를 증가시키는 버튼이다.

만약 입력된 T에 해당하는 시간을 맞출 수 없다면 -1을 출력해야하므로,

T를 10으로 나눴을 때 나머지가 존재한다면 1의자리인 초단위가 있다는 뜻이므로

A, B, C 만으로는 시간을 정확하게 맞출 수가 없다.

따라서 t % 10 == 0 이 아니라면 무조건 -1을 출력하도록 하고

나누어 떨어질 때만 계산과정을 진행시키면 된다.

 

그리디 알고리즘에 따라서,

가장 큰 것부터 계산을 해야 최소입력횟수를 얻을 수 있다.

 

T를 각 A,B,C 가 가지고 있는 초단위로 나눠서 해당 몫만큼을 얻어내면 된다.

가장 큰 단위인 A의 몫을 얻었다면

A * 몫을 계산한 값을 T에서 빼주고

다음번 B를 같은 방식으로 진행해주면 된다.

 

 

 

정답 코드

using System;

namespace _그리디_전자레인지
{
    class Program
    {
        static void Main(string[] args)
        {
            // 버튼 눌린 횟수 저장할 변수 선언
            int a = 0;
            int b = 0;
            int c = 0;

            // 시간 입력 받음
            int t = int.Parse(Console.ReadLine());

	// 최소단위인 10초로 나누어 떨어지는지 확인 -> 나머지가 존재한다면 -1을 출력해야함.
            if (t % 10 == 0)
            {
            	// 5분 = 300초보다 큰지 확인
                if (t >= 300)
                {
                	// t를 300으로 나눈 몫만큼이 a가 눌릴 횟수이다.
                    a = t / 300;
                    // t는 위에서 계산된 시간만큼을 빼야한다.
                    t -= 300 * a;
                } // 위에서 했던 과정을 반복
                if (t >= 60)
                {
                    b = t / 60;
                    t -= 60 * b;
                }
				// 남은 시간이 10초 보다 큰지 확인
                if (t >= 10)
                {
                    c = t / 10;
                }
                Console.WriteLine($"{a} {b} {c}");
            }
            
            // 10초 이하의 단위가 존재할 경우 -1을 출력
            else
            {
                Console.WriteLine(-1);
            }
        }
    }
}
반응형

댓글