코딩 테스트

[코딩테스트 12일차] BAEKJOON 2935번 : 소음

sunlight-dby 2025. 5. 3. 02:29

[BAEKJOON 2935번 : 소음]

[문제]

 

[고찰]

해당 문제를 보자마자 switch ~  case문으로 연산자를 비교하여, 더하고 곱하면 되겠다고 생각했습니다.

그런데 문제를 다시 검토해보니 최대 100자리라는 조건을 확인하였고, long long 자료형을 사용해야하나 싶었습니다.

 

하지만, (usigned) long long 자료형은 0부터 18,446,744,073,709,551,615까지로, 최대 20자리까지만 가능했습니다.

C++의 자료형 중 가장 큰 범위를 지원하는 것이 long long 자료형이기에, 길이가 최대 100자리인 10의 제곱 형태의 정수를 입력할 수 있는 자료형은 없다고 판단했고, 다시 문제를 검토해보았습니다.

 

문제를 다시 검토해보니, A와 B가 모두 10의 제곱 형태라는 것이 걸렸습니다.

10의 제곱 형태일 이유가 무엇일까를 생각해보니, 10의 제곱 형태를 계산할 때는 자릿수만 생각하면 된다는 것을 깨달았고

string을 활용하여 문제를 풀기로 하였습니다.

 

[개념]

 string을 활용하여 문제를 풀면서 사용하게 될 세 개의 메서드를 잠깐 정리하고자 합니다.

  • size( ) 메서드
    • 문자열의 현재 크기를 반환합니다.
    • 해당 문제에서는 A와 B의 자릿수를 알기 위하여 사용됩니다.
std::string str = "Hello";
int strSize = str.size();  // 5

 

  • append( ) 메서드
    • 문자열의 끝에 다른 문자열  또는 문자를 추가합니다.
    • 해당 문제에서는 A와 B를 곱셈할 때 사용됩니다.
      항상 맨 앞의 숫자는 1로 동일하므로 그 뒤에 자릿수를 0으로 채울 때, append( ) 메서드를 활용합니다.
std::string str1 = "Hello";

str1.append(" Wo");  // "Hello Wo"

std::string str2 = "lrd";
str1.append(str2);  // "Hello World"

str1.append(3, '!');  // "Hello World!!!"

std::string str3 = ",!?";

str1.append(str3, 1, 2);  // "Hello World!!!!?"

 

  • replace( ) 메서드
    • 문자열의 일부를 다른 문자열로 대체합니다.
    • 해당 문제에서는 A와 B를 덧셈할 때 사용됩니다.
      먼저, 문자열의 길이(자릿수)가 더 작은 문자열(A 또는 B)을 비교합니다.
      더 큰 문자열에서 더 작은 문자열에 해당하는 자릿수(인덱스)에 맞게, 더 작은 문자열로 대체합니다.
std::string str1 = "Hello, World!";
str1.replace(7, 5, "C++");  // Hello, C++!"

std::string str2 = "World";
str1.replace(7, 3, str2);  // Hello, World!"

 

 

[정리]

문제에서 주어지는 조건은 단순히 그냥 나오는 것이 아니라, 항상 이유가 있다는 것을 명심하면서 풀어야 한다는 것을 새삼 체감하였던 문제였습니다.

앞으로도 더욱 명심하면서 문제를 풀어야 겠습니다.

 

[Solution]

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

string ReturnAddResult(string A, string B, int A_size, int B_size)
{
    string result;
    
    if (A_size > B_size)
    {
        result = A;
        result.replace(A_size - B_size, B_size, B);
    }
    else if (B_size > A_size)
    {
        result = B;
        result.replace(B_size - A_size, A_size, A);
    }
    else
    {
        result += "2";
        for (int i = 0; i < A_size - 1; ++i)
        {
            result += "0";
        }
    }
    
    return result;
}

string ReturnMultiResult(string A, string B, int A_size, int B_size)
{
    string result;
    
    if (A_size > B_size)
    {
        result = A;
        for (int i = 0; i < B_size - 1; ++i)
        {
            result.append("0");
        }
    }
    else
    {
        result = B;
        for (int i = 0; i < A_size - 1; ++i)
        {
            result.append("0");
        }
    }
    
    return result;
}


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string A, B;
    string op;
    
    string result;
    
    getline(cin, A);
    getline(cin, op);
    getline(cin, B);
    
    if (op == "+")
    {
        result = ReturnAddResult(A, B, A.size(), B.size());
    }
    else if (op == "*")
    {
        result = ReturnMultiResult(A, B, A.size(), B.size());
    }
    
    cout << result;
    
    
    return 0;
}