본문 바로가기
Online-Judge/Baekjoon

[BOJ] C++ 10093번 숫자

by nyangzzi 2021. 5. 13.
반응형

https://www.acmicpc.net/problem/10093

 

10093번: 숫자

두 정수 A와 B가 주어진다. (1 ≤ A, B ≤ 1015, A와 B의 차이는 최대 100,000)

www.acmicpc.net

 

엄청 간단한 문제인 줄 알고 무시했다가 큰코 다친 문제.

 

정답률이 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

댓글