[백준/C++] 15707번 풀이

업데이트:



문제 정보


풀이

문제

두 정수 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보다 큰지 판단하는 프로그램을 작성하시오.를 만족하도록 로직을 구성하는 것입니다.

코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.

경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.



다음 읽을거리

관련 허브 페이지에서 같은 주제의 글을 이어서 확인할 수 있습니다.

댓글남기기