본문 바로가기
코테 문제

[백준] 10757번: 큰 수 A+B

by 케찹이 2021. 1. 8.
반응형

https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

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

www.acmicpc.net

문제

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

입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

출력

첫째 줄에 A+B를 출력한다.

예제 입력 1 복사

9223372036854775807 9223372036854775808

예제 출력 1 복사

18446744073709551615

 

 

#include<iostream>
#include<string.h>
#include<cstring>
#include<algorithm>

int main()
{
	std::string str1, str2;
	std::cin >> str1 >> str2;
	
	int str1_len = str1.length();
	int str2_len = str2.length();
	
	std::string str_new;
	int carry = 0;
	int temp = NULL;
	char save_char = NULL;
	
	if(str1_len == str2_len)
	{
		for(int i = str1_len - 1; i >= 0;i--)
		{
			temp = str1[i] + str2[i] - '0' - 48 + carry;
			carry = 0;
			if(temp >= 10)
			{
				carry=1;
				temp = temp - 10;
			}
			save_char = temp + 48;
			str_new.append(1, save_char);
			
		//	std::cout << "temp값은 : " << temp << std::endl;
			
			if(i==0 && carry == 1)
			{
				save_char = 1 + 48;
				str_new.append(1, save_char);
				break;
			}
			
			save_char = NULL;
			temp = 0;
		}
		
	}
	else if(str1_len > str2_len)
	{
		for(int i = 0; i < str2_len ;i++)
		{
			temp = str1[str1_len-i-1] + str2[str2_len-i-1] - '0' - 48 + carry;
			carry = 0;
			if(temp >= 10)
			{
				carry=1;
				temp = temp - 10;
			}
			save_char = temp + 48;
			str_new.append(1, save_char);
			
			save_char = NULL;
			temp = NULL;
		}
		
		for(int j = str1_len - str2_len - 1; j >=0; j--)
		{
			temp = str1[j] - 48 + carry;        //여기서는 '0'을 빼주지 않아도 좋다 왜인지는 모르겠음... 
			carry = 0;
			if(temp >= 10)
			{
				carry=1;
				temp = temp - 10;
			}
			save_char = temp + 48;
			str_new.append(1, save_char);
			
			if(j==0 && carry == 1 && temp == 0)
			{
				save_char = 1 + 48;
				str_new.append(1, save_char);
				break;
			}
			
			save_char = NULL;
			temp = 0;
		}
	}
	
	else
	{
			
		for(int i = 0; i < str1_len ;i++)
		{
			temp = str1[str1_len-i-1] + str2[str2_len-i-1] - '0' - 48 + carry;
			carry = 0;
			if(temp >= 10)
			{
				carry=1;
				temp = temp - 10;
			}
			save_char = temp + 48;
			str_new.append(1, save_char);
			
			save_char = NULL;
			temp = NULL;
		}
		
		for(int j = str2_len - str1_len - 1; j >=0; j--)
		{
			temp = str2[j] - 48 + carry;        //여기서는 '0'을 빼주지 않아도 좋다 왜인지는 모르겠음... 
			carry = 0;
			if(temp >= 10)
			{
				carry=1;
				temp = temp - 10;
			}
			save_char = temp + 48;
			str_new.append(1, save_char);
			
			if(j==0 && carry == 1 && temp == 0)
			{
				save_char = 1 + 48;
				str_new.append(1, save_char);
				break;
			}
			
			save_char = NULL;
			temp = 0;
		}
	} 
	
	
	
	while(str_new.length() > 0)
	{
		std::cout << str_new.back();
		str_new.pop_back();
	}
	std::cout << str_new << std::endl;
	
	return 0;
}

난이도가 브론즈5라는데 브론즈5치고는 조금 어려웠던 것 같습니다. 이 문제는 코딩 연습을 좀 하면 자주 나오는 문제인데 생각할게 조금은 있네요. 그리고 c++ string을 다루는 게 처음이어서 조금 더 낮설었던 것 같습니다. 아무래도 두 주어진 수의 길이를 더하기 위해선 뒤에서부터 더해 나가야 하니 그런 부분을 잘 생각해서 풀어야했습니다.

반응형

'코테 문제' 카테고리의 다른 글

[백준] 2581번 소수  (0) 2021.01.12
[백준] 1978번: 소수 찾기  (0) 2021.01.12
[백준] 10250번: ACM 호텔  (0) 2021.01.06
[백준] 2869번: 달팽이는 올라가고 싶다.  (0) 2021.01.06
[백준] 1193번: 분수찾기  (0) 2021.01.05

댓글