[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 함수로 표현하게 되면, 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;
}'코딩 테스트' 카테고리의 다른 글
| [코딩테스트 13일차] BAEKJOON 2953번, 3009번, 3053번 (0) | 2025.05.04 |
|---|---|
| [코딩테스트 12일차] BAEKJOON 2935번 : 소음 (0) | 2025.05.03 |
| [코딩테스트 10일차] BAEKJOON 2442번 ~ 2446번 : 별 찍기 5 ~ 9 (0) | 2025.04.26 |
| [코딩테스트 9일차] BAEKJOON 10808번, 11365번, 11720번 (0) | 2025.04.22 |
| [코딩테스트 8일차] BAEKJOON 2439, 2440번 : 별 찍기 - 2, 3 (0) | 2025.04.20 |