관리 메뉴

cococo-coding

[C++] 10162번. 전자레인지 본문

[BOJ] 코드 모음/C++_알고리즘

[C++] 10162번. 전자레인지

_dani 2024. 1. 28. 17:43

 

 

문제 분석

우선 그리디 알고리즘의 문제이다.

문제를 보면 '버튼 A,B,C를 누른 횟수의 합은 항상 최소가 되어야 한다. ~ 10번은 최소 횟수가 아니기 때문에 답이 될 수 없다'라는 문구를 보면 그리디임을 알 수 있다. 

 

그리고 맞춰야 할 조건들이 몇 개 있다.

1. T초를 맞추지 못하면 음수-1을 출력한다.

2. 버튼 조작 횟수를 출력할 때 해당 버튼을 누르지 않는 경우는 0을 출력한다.

 

이 부분만 주의하면 무난하게 풀 수 있는 문제였다. 

 

알고리즘 설계

우선은 요리시간을 초단위로 변환해서 (300초, 60초, 10초) 벡터로 만들어준다.

그리고 버튼클릭횟수도 총합이 아니라 각 버튼별 횟수로 출력해야하므로 벡터(나 배열)로 만들어준다.

기본적으로 벡터의 개수만 넣어서 만들어주면 자동으로 0으로 초기화된다.

vector <int> click(3); //0으로 초기화

보통 그리디 알고리즘처럼 for문으로 버튼횟수만큼 아래 구문을 반복한다.

click[i]=t / sec[i];
t=t% sec[i];

 

만약 t가 0이 되면 반복문을 나오도록 break처리를 해준다. 이때 나와서 버튼클릭횟수가 0인 애들은 이미 위에서 벡터를 0으로 초기화했기 때문에 문제가 없다.

 

그리고 위에서 1번 조건( T초를 맞추지 못하면 음수-1을 출력한다.) 을 구현할 코드를 다음과 같이 짰다.

만약 T가 남아있다면(T>0) T초를 맞추지 못한 것이므로, -1을 출력했다.

그게 아니라면 click[i] 벡터를 for문으로 반복해서 출력해주었다. 

 

코드

#include <iostream>
#include <vector>
using namespace std;
/*
1. 요리시간t를 입력받음
2. 버튼클릭수를 구함
3. 버튼클릭수를 출력

*/
int main() {
    //1
    int t;
    cin >> t;

    //2
    vector <int> click(3); //0으로 초기화
    vector <int> sec = { 300, 60,10 };

    for (int i = 0; i < 3; i++) {
        if (t == 0) break;
        click[i]=t / sec[i];
        t=t% sec[i];
    }

    if (t > 0) cout << "-1";
    else {
        for (int i = 0; i < 3; i++)
            cout << click[i] << ' ';
    }
    return 0;
}

 

느낀 점

기본 그리디 알고리즘 구문은 다 비슷한 것 같다. 

몫과 나머지를 구하는 구문을 반복하면 된다. 

 

이제 여기서 난이도가 갈리는 부분은 조건들이 여러 개 있는지의 여부인 것 같다.