정체불명의 모모

프로그래머스_level0_두 수의 합 본문

알고리즘 풀이

프로그래머스_level0_두 수의 합

정체불명의 모모 2024. 5. 13. 23:49

알고리즘 문제 풀어 보고 있습니다..

잘 못 합니다..

그냥 공부하는 메모장 입니다.


문제 설명

0 이상의 두 정수가 문자열 ab로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

제한 사항

  • 1 ≤ a의 길이 ≤ 100,000
  • 1 ≤ b의 길이 ≤ 100,000
  • a와 b는 숫자로만 이루어져 있습니다.
  • a와 b는 정수 0이 아니라면 0으로 시작하지 않습니다.

입출력 예

"582" "734" "1316"
"18446744073709551615" "287346502836570928366" "305793246910280479981"
"0" "0"

▶ 내 풀이 방법

string solution(string a, string b)
{
    int sum = 0;

    sum = atoi(a.c_str()) + atoi(b.c_str());

    string answer = to_string(sum);

    cout << answer << endl;
    return answer;
}

 

결과 : 다 실패 속도 느리고, 안되는 케이스도 존재 함... 너무 쉽게 생각 했음


▶ 잘된 풀이 방법

string answerSolution(string a, string b)
{
    /*
        length() 함수는 문자열의 길이를 반환하는 데에 특화되어 있으며, string 클래스에 종속적 입니다.
        일반적인 배열이나 다른 컨테이너에는 직접적으로 적용할 수 없습니다.
        따라서 문자열 객체인 string을 다루는 경우에 유용하게 사용 됩니다.
    */ 

    int alen = a.length();  
    int blen = b.length();
    int carry = 0;
    string answer = "";

    // 둘 중 더 큰값인걸 추르기 위해서 max 함수 사용
    std::cout << "max Test : " << max(alen, blen) << endl;

    for (int i = 1; i <= max(alen, blen); i++)
    {
        // - '0'을 해준 이유는 0의 아스키 코드값을 뺀 숫자이다.
        // a[alen - i]가 아스키 코드 숫자 값으로 나오기 때문에, 0을 빼므로써 정수 값이 나오게 처리
        int numa = (i > alen) ? 0 : a[alen - i] - '0'; 
        int numb = (i > blen) ? 0 : b[blen - i] - '0';
        int num = numa + numb + carry;

        if (num >= 10) carry = 1;
        else           carry = 0;

        char numc = num % 10 + '0';
        answer = numc + answer;
    }

    // for문이 다 돌고 carry의 값이 1이면 문자열 앞에 1을 붙이게 하기 위해 처리
    if (carry) answer = "1" + answer;

    cout << answer << endl;

    return answer;

}

 

 예제 케이스 2번의 경우 int 형보다 값이 커서 내가 한 방법으론 성립 되지 않았다.

 위 풀이 방법 처럼 하나씩 숫자들끼리 더해줘 아스키 코드를 이용해 string 형태로 합해줬다.


느낌점은... 내 스스로 피곤하게 머리를 쓰기 싫어서 대충 어영 부영 했다고 느꼈다.

다음에는 좀더 고민해 보고 테스트 케이스를 좀 더 확인해 봐야겠다.

그리고... 참 코드 깔끔하게 짜는 사람이 많구나를 새삼 느꼈다.

 

Comments