2023. 3. 16. 01:42ㆍProblem Solving/Math
그냥 간단하게 O(n)으로 해결할 수 있는 문제인 줄 알았다.
아니 맞긴한데 그냥 나 혼자 착각에 빠져서 삽질을 좀 했다.
문제에서 매 시간마다 술을 마신다고 나와 있고, 최초의 알코올 농도는 0이라고 명시되어 있다.
나는 이것을 읽고도 첫번째 술을 0시간 경과후에 마신다고 착각했다.
그래서 예제 입력 1에서 부터 막혔다.
후에 다시 1차원 그래프를 그려서 시간대별로 알코올농도를 계산해봤는데 첫번째 술을 1시간 경과후에 마시면 딱 예시에 맞게 답이 나왔다.
그리고 정답 코드를 보면 알겠지만 나는 혈중알코올농도를 소수가 아닌 정수로 취급해서 문제를 해결했다.
소수로 해도 맞을 것 같긴한데 일단 정수로 해도 답은 똑같이 나오고 실수 연산보다는 정수 연산이 더 빠를 것 같다는 합리적 의심이 들었다.
또한, 소수 연산은 현실의 소수 연산과 아주 미세한 오차가 있는데 백만번 연산하다보면 이 오차가 정답에 영향을 줄 수도 있겠다는 생각이 들었다.
때문에 그냥 안전빵으로 정수로 풀었다.
뭐 그렇게 해서 답은 쉽게 나왔는데 의문점이 생겼다.
i시간 경과후에 i번째 술을 마시게 되는데 그러면 n시간 경과후에 n번째 술을 마시게 된다.
이 때 n시간이 경과하였다는 것은 코딩테스트가 끝나는 시각을 의미하는데 이 때 혈중알코올농도가 0.129와 0.138 사이여도 이후의 1시간은 정답에 포함된다.
그런데 그 이후의 시간 즉, 코딩테스트가 끝나고 1시간 이후부터는 또 혈중알코올농도가 0.129와 0.138 사이여도 정답에 포함되지 않는다.
약간 일관성이 없다는 느낌을 받았다.
애초에 시험이 끝날 때까지만 혈중알코올농도가 0.129와 0.138 일 때의 시간을 구하라는 것이 더 낫다고 생각한다.
아니면 모든 알코올이 분해될 때까지의 시간을 구하라던가...
뭔가 코딩테스트가 끝나고 1시간만 정답에 포함된다는게 그냥 좀 그시기하다.
정답
#include <iostream>
using namespace std;
int n, l, answer, sum, alcohol[1000000];
int main(){
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
//input
cin >> n >> l;
for(int i = 0; i < n; i++)
cin >> alcohol[i];
//coding test
for(int i = 0; i < n; i++){
sum += alcohol[i];
if (i >= l)
sum -= alcohol[i - l];
if (sum >= 129 && sum <= 138)
answer++;
}
//output
cout << answer;
}'Problem Solving > Math' 카테고리의 다른 글
| [백준(BOJ)] GCD(n, k) = 1(11689번)_C++ (0) | 2023.03.29 |
|---|---|
| [백준(BOJ)] 선분 교차 2(17387번)_C++ (0) | 2023.03.27 |
| 백준(BOJ)_소수 구하기(1929번)_C++ (0) | 2023.02.28 |
| 백준(BOJ)_소수 찾기(1978번)_C++ (0) | 2023.02.28 |
| 백준(BOJ)_최대공약수와 최소공배수(2609번)_C++ (0) | 2023.02.28 |