🔗 문제 링크 : https://www.acmicpc.net/problem/2935
문제
수업 시간에 떠드는 두 학생이 있다. 두 학생은 수업에 집중하는 대신에 글로벌 경제 위기에 대해서 토론하고 있었다. 토론이 점점 과열되면서 두 학생은 목소리를 높였고, 결국 선생님은 크게 분노하였다.
이렇게 학생들이 수업 시간에 떠드는 문제는 어떻게 해결해야 할까?
얼마전에 초등학교 선생님으로 취직한 상근이는 이 문제를 수학 문제로 해결한다. 학생들을 진정시키기 위해 칠판에 수학 문제를 써주고, 아이들에게 조용히 이 문제를 풀게 한다. 학생들이 문제를 금방 풀고 다시 떠드는 것을 방지하기 위해서, 숫자를 매우 크게 한다.
아직 초등학교이기 때문에, 학생들은 덧셈과 곱셈만 배웠다. 또, 아직 10의 제곱꼴을 제외한 다른 수는 학교에서 배우지 않았기 때문에, 선생님이 써주는 수는 모두 10의 제곱 형태이다.
쉬는 시간까지 문제를 푸는 것을 막기 위해서, 선생님이 써주는 숫자는 최대 100자리이다.
칠판에 쓰여 있는 문제가 주어졌을 때, 결과를 구하는 프로그램을 작성하시오.
입출력 예시
입력
첫째 줄에 양의 정수 A가 주어진다.
둘째 줄에 연산자 + 또는 *가 주어진다.
셋째 줄에 양의 정수 B가 주어진다.
A와 B는 모두 10의 제곱 형태이고, 길이는 최대 100자리이다.
출력
첫째 줄에 결과를 출력한다. 결과는 A+B 또는 A*B이며, 입력에서 주어지는 연산자에 의해 결정된다.
풀이
간단 연산 구현 문제인 줄 알았지만, 입력값이 10의 제곱 형태며 길이가 최대 100자리인걸 보니 long long으로도 풀이가 불가능하다.
따라서 string으로 푸는 방법을 택했다.
🔖 덧셈 ' + '
입력값 S0, S1의 길이(자릿수)가 같은 경우와 다른 경우의 처리로 분류한다.
- S0와 S1의 자릿수가 같은 경우 : 맨 앞자리만 '2'로 설정해 주고, S0 or S1의 자릿수 - 1 만큼 0으로 채워준다.
- 예를 들어 1000 + 1000 는 두 입력값의 자릿수가 4이므로, '2'에 0을 4 - 1 = 3 만큼 0을 채워주면 결과 "2000" 이 나온다.
- 더 간단한 방법으로는 S0 or S1에서 맨 앞 글자만 '2'로 바꾸는 방법도 있다.
이 글을 쓰면서 생각난 더 쉬운 방법..
- S0와 S1의 자릿수가 다른 경우 : 자릿수가 더 많은 입력값에서, 뒤에서 다른 입력값의 자릿수만큼 이동하여 해당 부분을 '1'로 수정한다.
- 예를 들어 1000 + 10 는 자릿수가 더 많은 "1000"에서 다른 입력값("10")의 자릿수는 2이므로, 뒤에서 2번째 글자를 1로 수정한다. 1000 -> 1010
🔖 곱셈 ' * '
'1'에 두 입력값의 포함된 0의 개수만큼 '0'을 붙여준다.
예를 들어 10000 * 100 인 경우, 입력값의 0의 갯수 = 자릿수 - 1이므로 "10000"에서 '0'의 개수는 5 - 1 = 4 이고, "100"에서 '0'의 개수는 3 - 1 = 2 이다.
따라서, '1'에 '0'을 6번(4 + 2) 붙여주면 10000 * 100의 결과값인 1000000을 출력할 수 있다.
#include <iostream>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
string S0, S1;
string result;
char C;
cin >> S0 >> C >> S1;
/* '+' */
if (C == '+') {
if (S0.size() == S1.size()) {
result = "2";
for (int i = 0; i < S0.size() - 1; i++) {
result += "0";
}
}
else {
result = S0.size() > S1.size() ? S0 : S1;
int shortL = S0.size() < S1.size() ? S0.size() : S1.size();
result[result.size() - shortL] = '1';
}
}
/* '*' */
else {
result = "1";
for (int i = 0; i < S0.size() + S1.size() - 2; i++) {
result += "0";
}
}
cout << result;
}
'🐸 Problem Solving > BOJ' 카테고리의 다른 글
[BOJ/C++] 백준 16928번: 뱀과 사다리 게임 (0) | 2024.10.21 |
---|---|
[BOJ/C++] 백준 9251번: LCS (0) | 2024.10.18 |
[BOJ/C++] 백준 1535번: 안녕 (1) | 2024.10.14 |