https://www.acmicpc.net/problem/10093
엄청 간단한 문제인 줄 알고 무시했다가 큰코 다친 문제.
정답률이 22.235% 밖에 되지 않길래 황당했는데
막상 제출 할 때마다 출력 초과가 떠서 당황스러웠다.
결론부터 말하자면 문제와 코드를 꼼꼼히 보지 않고 작성하는 바람에
overflow가 발생한 경우였다.
내가 범한 실수는 다음과 같다.
1. 출력 해야하는 조건은 두 가지 이다.
1) 첫째 줄 : 두 수 사이에 있는 수의 개수
2) 둘째 줄 : 두 수 사이에 있는 수를 오름차순으로 출력
문제를 대충 읽고 첫 번째 줄을 출력하지 않았다...
2. A < B, A == B, A > B인 경우를 모두 고려해야한다.
1 ) A == B인 경우에는 사이 수가 0
따라서 두 수 사이에 있는 수는 존재하지 않으므로 둘째 줄은 출력하지 않는다.
2) A > B인 경우
A와 B를 swap하여 무조건 B가 큰 수가 되도록 만들어 주었다.
(max와 min 변수를 사용하면 가독성이 높아질 수 있다.)
3. input범위가 1 ≤ A, B ≤ 10^15 이므로
unsigned long long 형으로 선언해주어야한다.
A와 B 선언은 잘 해줘서 생각도 못했는데,
A가 B보다 큰 경우 swap을 할 때 이용하는 tmp 변수와
for문 안의 변수 i를 int형으로 선언했다.
위와 같은 실수를 했을 경우, overflow가 발생하여
오류 대신 틀렸습니다 혹은 출력 초과가 발생할 수 있으니 주의해야한다.
1번과 2번은 금방 해결했는데 3번을 뒤늦게 알아채서 헤맸다.
요즘 이런 실수 한 적 없는데 블로그에 첫 글 올릴 생각에 신나서 빨리 풀려다가 그만..ㅎ
앞으로는 문제 꼼꼼히 보자
[ BOJ-10093.cpp]
#include <iostream>
using namespace std;
int main() {
unsigned long long a = 0, b = 0;
cin >> a >> b;
if (a > b) {
unsigned long long tmp = b;
b = a;
a = tmp;
}
if (a == b) {
cout << 0 << endl;
}
else {
cout << b - a - 1 << endl;
for (unsigned long long i = a + 1; i < b; i++) {
if (i == b - 1) cout << i;
else cout << i << " ";
}
}
}
'Online-Judge > Baekjoon' 카테고리의 다른 글
[BOJ] C++ 10869번 사칙연산 (0) | 2021.05.14 |
---|---|
[BOJ] C++ 10998번 AXB (0) | 2021.05.14 |
[BOJ] C++ 2557번 Hello World (0) | 2021.05.13 |
[BOJ] C++ 1001번 A-B (0) | 2021.05.13 |
[BOJ] C++ 1000번 A+B (0) | 2021.05.13 |
댓글