10733: 제로(백준)

2021. 9. 19. 23:56문제연습/알고리즘

반응형

 

 

문제 해결 과정)

이전 문제인 스택처럼 직접 기능을 구현할 수 있지만 C++에서 기본적으로 제공하는 표준 템플릿 라이브러리(STL) 연습할 겸 간단하게 코드를 작성했습니다.

(확실히 코드가 깔끔하죠?)

#include <iostream>
#include <stack>
using namespace std;

int main() {
	int count = 0;
	int num = 0;
	int sum = 0;
	stack <int> s;

	cin >> count;
	for (int i = 0; i < count; i++) {
		cin >> num;
		if (num == 0)
			s.pop();
		else
			s.push(num);
	}

	while (true) {
		if (s.empty())
			break;
		sum += s.top();
		s.pop();
	}
	cout << sum;
}

 

정상적으로 테스트 케이스 확인한 결과입니다.

 

cppcheck로 소스코드를 확인해 보면 특별한 issue는 없는 것으로 확인됩니다.

 

 

물론 이는 언제까지나 백준상에서 범위 내의 값을 입력한다고 보장이 있을 경우에는 상관이 없지만

임의의 큰 정수나 음수를 입력하게 될 경우 integer overflow 현상이 발생하여 프로그램이 정상 작동이 되지 않을 수 있습니다.

 

이를 방어하기 위해서는 당연히 입력값을 검증하는 로직을 추가해 주면 되는데 문제에서 입력값의 범위가 1 ≤ K ≤ 100,000이므로 간단하게 아래와 같은 조건문을 추가해 예외 처리하면 됩니다.

if (count < 1 || count>100000) {
	cout << "input error!!1";
	return 0;
}

 

만약 부호 있는 두 정수(int)가 입력을 받게 될 경우에는 위처럼 작성하면 안되고 아래와 같이 작성해야 됩니다.

int check_overflow(int sum, int a, int b) 
{ 
    if( a > INT_MAX - b) 
        return-1; 

    else
    { 
        sum= a + b; 
        return sum; 
    } 
}

 

두 개의 int형 변수 합이 INT_MAX 값을 초과할 수 없다는 점을 이용하여 만든 로직입니다.

이외에도 다양한 방법이 있으니 찾아보는 것도 좋을 것 같습니다.

 

반응형

'문제연습 > 알고리즘' 카테고리의 다른 글

11047: 동전 0(백준)  (0) 2022.01.07
2164: 카드 2(백준)  (0) 2021.09.29
10828: 스택(백준)  (0) 2021.09.19
3. Brute Force (1)  (0) 2020.02.22
2. 시뮬레이션  (0) 2020.02.10