ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1일 1백준 : 10757번] 큰 수 A+B
    Programming/백준 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;
    }

     

    10757번: 큰 수 A+B (acmicpc.net)

     

    10757번: 큰 수 A+B

    두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

    www.acmicpc.net

     

     
Designed by Tistory.