-
[1일 1백준 : 10757번] 큰 수 A+BProgramming/백준 2021. 2. 10. 21:18
푸는데 3일이 걸렸다..
이 문제는 간단하게 A + B를 하면 되는 문제인데,
Python은 그냥 Print(A+B)를 하면 바로 정답처리가 되지만 C/C++에서는 담을 수 있는 자료형의 한계가 있기 때문에 이를 다른 방식으로 처리를 해줘야 한다.
근데 문제가 지금 짠 코드의 입력값에 따른 결과값은 모두 일치하지만 백준에 제출을 했을 때 게속 오답처리가 나왔다..
그래서 질문 게시판에도 질문을 올려보고 이것저것 해보다 보니 제출할 때 언어를 C++이 아니라 C++ (Clang)으로 바꾸니깐 정답처리가 되었다..
원인은 모르겠으나 이런식으로 정답처리가 되니깐 3일동안 노력한게 헛수고가 되는 것 같아서 허탈감을 많이 느꼈다..
#include <iostream> // 11 11111 -> 11122 // 11111 11 -> 11122 // 111 111 -> 222 // 9999 99 -> 10098 // 99 9999 -> 10098 // 999 999 -> 1998 int ConvertCharToInt(char c) { return ((int)c) % 48; } char ConvertIntToChar(int number) { if (number < 0 && 57 < number) return '\0'; return (char)(number + 48); } std::string SumTwoDigits(char a, char b) { char r[2] = { '\0' }; int nR = ConvertCharToInt(a) + ConvertCharToInt(b); r[0] = ConvertIntToChar((nR / 10)); r[1] = ConvertIntToChar((nR % 10)); return r; } int main(void) { std::cin.tie(NULL); std::cout.tie(NULL); std::ios::sync_with_stdio(false); std::string A, B, result; std::cin >> A >> B; int ALength = A.size(); int BLength = B.size(); int length; bool AIsHigher; if (ALength >= BLength) { length = ALength; AIsHigher = true; B.insert(B.begin(), ALength - BLength, '0'); } else { length = BLength; AIsHigher = false; A.insert(A.begin(), BLength - ALength, '0'); } result.resize(length + 1, '\0'); if (!AIsHigher) { A.swap(B); } for (int i = length - 1; 0 <= i; i--) { // 각 자리의 수를 더함 std::string twoSum = SumTwoDigits(A[i], B[i]); // 더했을 때 첫번쨰 자리수와 두번째 자리수를 나눔 (9이하가 출력되면 09, 08.. 이런식으로, 10이상은 10, 11..) char tens = twoSum[0]; char units = twoSum[1]; int cur = i + 1; int next = (i - 1 < 0 ? 0 : (i - 1) + 1); if (tens == '0') // ex) 09 { if (result[cur] == '\0') // 더하려는 곳에 자리가 없는경우 { result[next] = tens; result[cur] = units; } else if (result[cur] != '0') // 더하려는 곳에 이미 자리가 있는 경우 { // 이미 있는 자리에 새로운 값을 더한다 std::string digitsSum = SumTwoDigits(result[cur], units); result[next] = digitsSum[0]; result[cur] = digitsSum[1]; } else { result[cur] = units; } } else if (tens != '0') // 각 자리수를 더했는데, 이떄 더한 값이 10이상이 되었을 때 // ex) 16 { // 더하려는 곳에 이미 자리가 있는 경우 if (result[cur] == '\0') { // 그대로 더한 값을 넣어준다. result[next] = tens; result[cur] = units; } else if (result[cur] != '0') { // 이미 있는 자리에 새로운 값을 더한다 std::string digitsSum = SumTwoDigits(result[cur], units); result[next] = tens; result[cur] = digitsSum[1]; } else { result[next] = tens; result[cur] = units; } } } if (result.front() == '0') result = result.substr(1); if (result.front() == '\0') result = result.substr(1); std::cout << result << "\n"; return 0; }
'Programming > 백준' 카테고리의 다른 글
[1일 1백준 : 2581번] 소수 (0) 2021.03.08 [1일 1백준 : 1978번] 소수 찾기 (0) 2021.03.08 [1일 1백준 : 2839번] 설탕배달 (0) 2021.02.08 [1일 1백준 : 2775번] 부녀회장이 될테야 (0) 2021.02.07 [1일 1백준 : 10250번] ACM 호텔 (0) 2021.02.03