정체불명의 모모
프로그래머스_level0_두 수의 합 본문
알고리즘 문제 풀어 보고 있습니다..
잘 못 합니다..
그냥 공부하는 메모장 입니다.
문제 설명
0 이상의 두 정수가 문자열 a, b로 주어질 때, 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 형태로 합해줬다.
느낌점은... 내 스스로 피곤하게 머리를 쓰기 싫어서 대충 어영 부영 했다고 느꼈다.
다음에는 좀더 고민해 보고 테스트 케이스를 좀 더 확인해 봐야겠다.
그리고... 참 코드 깔끔하게 짜는 사람이 많구나를 새삼 느꼈다.
![](https://t1.daumcdn.net/keditor/emoticon/face/large/006.png)
Comments