[백준/C++] 15707번 풀이
업데이트:
문제 정보
- 문제 출처: 백준 온라인 저지
- 문제 링크: 15707번 문제
- 문제풀이 코드 GitHub 링크
- 제출 언어: C++17
풀이
문제
두 정수 a와 b를 곱한 값이, r보다 큰지 판단하는 프로그램을 작성하시오.
입력 요약
첫째 줄에 정수 a, b, r이 공백으로 구분되어 주어진다. (0 ≤ a, b ≤ 1020, 0 ≤ r < 263)
각 정수 a, b, r이 ‘0’인 경우를 제외하고, 0으로 시작하는 입력은 주어지지 않는다.
출력 요약
a와 b를 곱한 값이 r보다 크면 overflow를, 그렇지 않다면 a와 b를 곱한 값을 출력하라.
코드
#include <iostream>
#include <string>
#define max(x,y) x>y?x:y
using namespace std;
class BigInt {
public:
string value;
BigInt() {
value = "0";
}
BigInt(string &string) {
value = string;
}
BigInt operator + (BigInt& operand) {
int size = max(value.length(), operand.value.length());
int* result = new int[size];
int c = 0;
for (int i = 0; i < size; i++) {
result[size - i - 1] = c;
if (value.length() > i) result[size - i - 1] += value[value.length()-i-1] - '0';
if (operand.value.length() > i) result[size - i - 1] += operand.value[operand.value.length()-i-1] - '0';
c = result[size - i - 1] / 10;
result[size - i - 1] %= 10;
}
string s = to_string(c);
for (int i = 0; i < size; i++) {
s+=to_string(result[i]);
}
while (s[0] == '0' && s.length() > 1) {
s=s.substr(1, s.length() - 1);
}
delete result;
return BigInt(s);
}
BigInt operator * (BigInt& operand) {
BigInt ac = BigInt();
for (int i = 0; i < operand.value.length(); i++) {
int* temp = new int[value.length() + 1];
temp[value.length()] = 0;
for (int j = 0; j < value.length(); j++) {
temp[value.length() - j] += (value[value.length() - j - 1]-'0') * (operand.value[operand.value.length() - i - 1] - '0');
temp[value.length() - j - 1] = temp[value.length() - j] / 10;
temp[value.length() - j] %= 10;
}
string s = to_string(temp[0]);
for (int k = 1; k < value.length() + 1; k++) {
s += to_string(temp[k]);
}
for (int k = 0; k < i; k++) {
s += "0";
}
BigInt t = BigInt(s);
ac = ac + t;
}
return ac;
}
bool operator > (BigInt& operand) {
if (value.length() == operand.value.length()) {
for (int i = 0; i < value.length(); i++) {
if (value[i] == operand.value[i]) continue;
return value[i] >= operand.value[i];
}
}
return value.length() > operand.value.length();
}
};
int main() {
string a, b, r;
cin >> a >> b >> r;
BigInt A = BigInt(a), B = BigInt(b), R = BigInt(r);
BigInt AB = A * B;
if (AB > R) cout << "overflow";
else cout << AB.value;
return 0;
}
설명
핵심은 구현 관점에서 두 정수 a와 b를 곱한 값이, r보다 큰지 판단하는 프로그램을 작성하시오.를 만족하도록 로직을 구성하는 것입니다.
코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.
경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.
댓글남기기