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 |