Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 웹
- 코딩테스트준비
- 파이썬
- 연결 리스트
- 1일1코테
- 코드트리
- 갭체크
- Java
- 데이터베이스
- 자바스크립트
- 개발자루틴
- 운영체제
- 플로이드-워셜
- 오블완
- 항해99
- 인접 행렬
- 알고리즘
- 자료구조
- 코딩테스트사이트추천
- 코테공부
- til
- 자바
- 티스토리챌린지
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 코딩테스트
- 99클럽
- C
- 프로그래머스
- 프로그래밍 언어
- 개발자취업
Archives
- Today
- Total
와드의 블로그
큰 수 A+B (2) 본문
문제
두 양의 정수 A와 B가 주어졌을 때, A+B를 구하는 문제입니다. C++의 기본 정수 자료형인 long long은 최대 19자리(약 900경)까지만 표현할 수 있습니다. 하지만 이 문제에서는 최대 10,000자리까지의 숫자가 주어지므로 기본 자료형으로는 계산할 수 없습니다. 따라서 숫자를 **문자열(String)**로 입력받아 각 자릿수를 직접 더하는 방식을 사용해야 합니다.
- 입력: 첫째 줄에 A와 B가 공백을 사이에 두고 주어집니다. (0 < A, B < 10^10000)
- 출력: 첫째 줄에 A+B를 출력합니다.
링크: https://www.acmicpc.net/problem/15353
풀이: 문자열 기반의 덧셈 구현
초등학교에서 덧셈을 배울 때처럼, 숫자의 일의 자리(문자열의 맨 뒷부분)부터 앞으로 이동하며 각 자릿수를 더해주고, 받아올림(Carry)이 발생하면 다음 자릿수로 넘겨주는 방식으로 구현합니다.
- 길이 비교 및 스왑: 덧셈 로직(addStr)을 하나로 깔끔하게 처리하기 위해, 항상 s1 문자열이 s2 문자열보다 길이가 길거나 같도록 위치를 바꿉니다(swap).
- 뒤에서부터 덧셈 수행: 긴 문자열(s1)의 길이만큼 반복문을 돕니다. 인덱스를 조작하여 문자열의 맨 뒤에서부터 숫자(a, b)를 꺼내 정수형으로 변환합니다. 이때 짧은 문자열(s2)은 인덱스 범위를 초과하지 않도록 검사하여, 초과한 자리는 0으로 처리합니다.
- 받아올림(Carry) 처리: 각 자릿수 a와 b, 그리고 아랫자리에서 넘어온 받아올림 값 c를 모두 더합니다(tmp). 현재 자릿수에 남을 값은 tmp % 10이 되며 이를 결과 문자열에 추가하고, 다음 자리로 넘어갈 받아올림 값은 tmp / 10으로 갱신합니다.
- 결과 문자열 뒤집기: 일의 자리부터 결과 문자열에 추가했으므로, 완성된 문자열은 원래 숫자의 역순이 됩니다. 따라서 C++의 algorithm 헤더에 있는 reverse() 함수를 사용하여 문자열을 올바른 순서로 뒤집어 반환합니다.
코드 (C++)
#include <bits/stdc++.h>
using namespace std;
// 두 큰 수(문자열)를 더하는 함수 (항상 s1의 길이가 s2보다 크거나 같다고 가정)
string addStr(string s1, string s2) {
string ans = "";
int c = 0; // 받아올림(Carry) 변수
int len1 = s1.length();
int len2 = s2.length();
for (int i = 0; i < len1; i++) {
// 긴 문자열의 뒤에서부터 숫자를 꺼냄
int a = s1[len1 - i - 1] - '0';
int b = 0;
// 짧은 문자열의 인덱스 초과를 방지하며 뒤에서부터 숫자를 꺼냄
if (i < len2) {
b = s2[len2 - i - 1] - '0';
}
int tmp = a + b + c;
ans += to_string(tmp % 10); // 현재 자릿수의 나머지 저장
c = tmp / 10; // 다음 자리로 넘어갈 받아올림 갱신
}
// 제일 높은 자릿수에서 받아올림이 남은 경우 처리
if (c != 0) {
ans += to_string(c);
}
// 일의 자리부터 추가했으므로 역순으로 뒤집어줌
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
// C++ 입출력 속도 향상
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s1, s2;
cin >> s1 >> s2;
// 항상 s1이 s2보다 길거나 같도록 조정 (기존 코드 논리 오류 보완)
if (s1.length() < s2.length()) {
swap(s1, s2);
}
cout << addStr(s1, s2) << "\n";
return 0;
}
알고리즘 분류
수학, 문자열 처리, 임의 정밀도 / 큰 수 연산
'PS > B.O.J' 카테고리의 다른 글
| 5430번: AC (0) | 2026.03.29 |
|---|---|
| 14405번: 피카츄 (0) | 2026.03.29 |
| 12869번: 뮤탈리스크 (0) | 2026.03.28 |
| 4179번: 불! (0) | 2026.03.28 |
| 16234번: 인구 이동 (0) | 2026.03.28 |