코딩 테스트

[코딩테스트 11일차] BAEKJOON 2525번 : 오븐시계, BAEKJOON 2914번 : 저작권

sunlight-dby 2025. 5. 1. 01:15

[BAEKJOON 2525번 : 오븐 시계]

[문제]

 

[고찰]

#include <iostream>

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int a, b, c;
    
    cin >> a >> b;
    cin >> c;
    
    int m = b + c;
    int h = a + m / 60;
    
    if (m >= 60)
        if (h >= 24)
            cout << h - 24 << " " << m % 60;
        else
            cout << h << " " << m % 60;
    else
        cout << a << " " << m;
        
        
    return 0;
}

 

위의 코드는 제가 처음 문제를 풀었을 때, if문을 활용하여 풀었던 답안입니다.

해당 답변도 맞기는 했지만, 이렇게 푸는 것보다는 입력의 시간을 분으로 계산하였다면 더 깔끔하고, 효율적으로 문제를 풀었을 수 있을 것 같다는 생각이 들어 다시 풀어보았습니다.

 

[정리]

해당 문제는 두 가지의 아이디어로 풀어볼 수 있습니다.

 

첫 번째는 입력받은 A와 B를 모두 분으로 변환한 후, C를 더하여 나온 결과 값을 다시 시와 분으로 변환하는 방법입니다.

두 번째는 C를 시와 분으로 변환한 뒤, 각각 A와 B에 더하여 계산하는 방법입니다.

 

두 번째 방법을 사용했을 때는 분이 60분을 넘었을 때, 시각으로 올림이 발생하게 되면서 이를 고려해야하기 때문에 번거로울 수 있습니다.

 

그렇기에 첫 번째 방법을 활용하여 다시 풀어보았습니다.

 

[Solution]

#include <iostream>

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int a, b, c;
    
    cin >> a >> b;
    cin >> c;
    
    int total_min = a * 60 + b;
    total_min += c;
    
    int hour = (total_min / 60) % 24;
    int min = total_min % 60;
    
    cout << hout << " " << min;
    
    return 0;
}

 


[BAEKJOON 2914번 : 저작권]

[문제]

 

[고찰]

해당 문제는 아이디어는 어느정도 구색이 잡히는데 풀 방법을 찾지 못해서 검색을 해보았습니다.

그러나 제가 떠올린 아이디어는 잘못된 아이디어였고, 접근조차 못했다는 사실을 알게되었습니다.

따라서 이를 정리합니다.

 

[개념]

문제를 풀기 전, 알아둬야 할 개념과 그와 관련된 개념을 먼저 정리합니다.

 

[ceil & floor]

  • 헤더파일
    • <cmath>
  •  함수 원형 (오버로딩 지원)
    • double ceil (double x);
    • floor ceil (float x);
    • long double ceil (long double x);
    • double floor (double x);
    • floor floor (float x );
    • long double floor (long double x);
  • 사용법
    • ceil()
      • ceil(x)는 인자 x보다 크거나 같은 가장 작은 정수 값을 반환합니다.
      • 소수점 이하가 0이 아닌 경우 무조건 올림합니다.
        • std::ceil(3.7) = 4.0
        • std::ceil(-3.2) = -3.0
    • floor()
      • floor(x)는 인자 x보다 작거나 같은 가장 큰 정수 값을 반환합니다.
      • 소수점 이하를 무조건 내림합니다.
        • std::floor(3.7) = 3.0
        • std::floor(-3.2) = -4.0

[정리]

위의 개념을 알고 있을 때, 해당 문제에서 필요한 함수는 ceil 함수입니다. 

평균값을 ceil 함수로 표현하게 되면, ceil(M / A) = I 가 됩니다.

(※ 저작권이 있는 멜로디의 최소 개수를 M이라 표현)

 

이는 다음 부등식을 의미합니다.

I - 1 < M / A ≤ I

 

M / A는 I 보다 작거나 같아야 합니다.

또한, 평균값 I가 항상 올림이 되어 있기 때문에 M / A는 I - 1보다는 항상 크게 됩니다.

 

쉽게 생각하면, M / A가 4.0일 때는 ceil 함수에 따라 5여야 하고, 5.1일 때는 6이 되어야 합니다.

ceil(M / A) = 5의 식을 성립하려면 M / A는 4보다는 무조건 크고 5보다는 작거나 같아야합니다.

즉, 4  < M / A ≤ 5가 됩니다.

 

이제 원하는 답인 M을 구하기만 하면 됩니다. 그렇기 위해 A를 부등식의 양 경계값에 곱해줍니다.

(I - 1) x A < M ≤ I x A

 

최종적으로 멜로디의 수는 정수이므로, 해당 범위에서 최솟값을 구하기 위해 (I - 1) x A에 +1을 더해줘야 합니다.

 

구하고자 하는 M의 최솟값은 (I - 1) x A + 1이 됩니다.

 

[Solution]

#include <iostream>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int A, I;
    cin >> A >> I;
    
    int min_melodies = A * (I - 1) + 1;
    
    cout << min_melodies << endl;
    
    return 0;
}