본문 바로가기

백준/C++

[BaeKJoon/C++] 백준 2935 c++ 소음

반응형

https://www.acmicpc.net/problem/2935

 

2935번: 소음

수업 시간에 떠드는 두 학생이 있다. 두 학생은 수업에 집중하는 대신에 글로벌 경제 위기에 대해서 토론하고 있었다. 토론이 점점 과열되면서 두 학생은 목소리를 높였고, 결국 선생님은 크게

www.acmicpc.net

문제

수업 시간에 떠드는 두 학생이 있다. 두 학생은 수업에 집중하는 대신에 글로벌 경제 위기에 대해서 토론하고 있었다. 토론이 점점 과열되면서 두 학생은 목소리를 높였고, 결국 선생님은 크게 분노하였다.

이렇게 학생들이 수업 시간에 떠드는 문제는 어떻게 해결해야 할까?

얼마 전에 초등학교 선생님으로 취직한 상근이는 이 문제를 수학 문제로 해결한다. 학생들을 진정시키기 위해 칠판에 수학 문제를 써주고, 아이들에게 조용히 이 문제를 풀게 한다. 학생들이 문제를 금방 풀고 다시 떠드는 것을 방지하기 위해서, 숫자를 매우 크게 한다.

아직 초등학교이기 때문에, 학생들은 덧셈과 곱셈만 배웠다. 또, 아직 10의 제곱 꼴을 제외한 다른 수는 학교에서 배우지 않았기 때문에, 선생님이 써주는 수는 모두 10의 제곱 형태이다.

쉬는 시간까지 문제를 푸는 것을 막기 위해서, 선생님이 써주는 숫자는 최대 100자리이다.

칠판에 쓰여 있는 문제가 주어졌을 때, 결과를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 양의 정수 A가 주어진다.

둘째 줄에 연산자 + 또는 *가 주어진다.

셋째 줄에 양의 정수 B가 주어진다.

A와 B는 모두 10의 제곱 형태이고, 길이는 최대 100자리이다.

출력

첫째 줄에 결과를 출력한다. 결과는 A+B 또는 A*B이며, 입력에서 주어지는 연산자에 의해 결정된다. 

예제 입력 1 복사

1000
*
100

예제 출력 1 복사

100000

예제 입력 2 복사

10000
+
10

예제 출력 2 복사

10010

예제 입력 3 복사

10
+
1000

예제 출력 3 복사

1010

예제 입력 4 복사

1
*
1000

예제 출력 4 복사

1000

코드

#include <iostream>
 
using namespace std;
 
int main() {
 
    string str, str1;
    char ch;
 
    cin>>str>>ch>>str1;
 
    int strsize = str.length();
    int str1size = str1.length();
 
    // * 일때 str, str1 수 0의개수 파악
    if(ch=='*'){
        int totalsize = strsize + str1size -2;
        cout<<'1';
        for(int i=0; i<totalsize; i++){
            cout<<0;
        }
    }
 
    else{
        // + 일때 두수의 자릿수가 같을 때
        if(strsize==str1size){
            cout<<'2';
            for(int i=0; i<strsize-1; i++){
                cout<<'0';
            }
        }
        // + 일때 두수의 자릿수가 다를 때
        else if(strsize!=str1size){
            int a=max(strsize, str1size);       // keypoint max(a,b) a,b 중 가장 큰값 출력
            int b=min(strsize, str1size);       //          min(a,b) a.b 중 가장 작은값 출력
                for(int i=a; i>0; i--){         // ex) a=4 -> 4321
                    if(i==a||i==b){             // ex) a=4, b=2 -> 1010
                        cout<<'1';
                    }
                    else{
                        cout<<'0';
                    }
                }
            }
        }
        return 0;
}
 
cs

정리

처음에는 두 수를 string으로 변수를 생성해서 각각 stoi 해주고 더하는 방법으로 했었다.

하지만 A와 B는 모두 10의 제곱 형태이고, 길이는 최대 100자리이다.  이런 글을 보고 usinged int로 해도 범위가 넘어가 버린다고 생각했다.

그래서 10의 제곱으로만 이루어진다고 해서 나오는 숫자는 곧 1,0뿐이다. 

그리고 입력받은 문자열을 size()로 크기를 구한 다음 두 개의 문자열이 같은 자릿수 일 때는 2를 출력하고 크기만큼 0을 for문으로 출력하는 방법을 생각해 냈다. 

좀 어려웠던 건 두 수가 다른 자릿수 일 때다. 크기가 큰 문자열은 상관없지만 크기가 작은 문자열에서 1을 어떻게 넣어야 되는지 참 난감했다. 

여기서 생각해 낸 게 templete 함수의 max(a, b), min(a, b)다.

max(a, b)는 a와 b 중 큰 값을 나오게 하는 코드이고,

min(a, b)는 a와 b 중 작은 값을 나오게 하는 코드이다.

a> b일 때 각각 a, b가 나온다.

이 코드를 통해 1의 자리를 구할 수 있게 됐다.

반응형