목차
[BaekJoon-10824] 네 수
문제
네 자연수 A, B, C, D가 주어진다. 이때, A와 B를 붙인 수와 C와 D를 붙인 수의 합을 구하는 프로그램을 작성하시오.
두 수 A와 B를 합치는 것은 A의 뒤에 B를 붙이는 것을 의미한다. 즉, 20과 30을 붙이면 2030이 된다.
입력
첫째 줄에 네 자연수 A, B, C, D가 주어진다. (1 ≤ A, B, C, D ≤ 1,000,000)
출력
A와 B를 붙인 수와 C와 D를 붙인 수의 합을 출력한다.
예제 입력 1
10 20 30 40
예제 출력 1
4060
숫자 계산보다 먼저 붙이기
10 20 30 40에서는 10+20과 30+40을 계산하는 문제가 아니다. 자릿수를 붙여 1020 + 3040 = 4060을 계산한다. 덧셈 전에 문자열을 연결하면 B나 D의 자릿수를 직접 계산할 필요가 없다. 입력 범위에서 한 수는 최대 7자리이므로 연결한 수는 최대 14자리다. int는 넘을 수 있어 long으로 파싱한다.
첫 코드는 split[0] + split[1]로 두 문자열을 이어 붙인 뒤 Long.parseLong으로 수로 바꾼다. 두 번째 코드는 파싱을 직접 풀어 쓴 연습이다. 오른쪽 끝부터 읽으며 일의 자리에는 1, 십의 자리에는 10, 그다음에는 100을 곱한다. 2030은 0×1 + 3×10 + 0×100 + 2×1000이다. 실제 풀이에는 표준 파서를 쓰는 쪽이 간결하다.
입력 네 수의 전체 자릿수를 K라고 하면 문자열 연결·파싱은 O(K), 연결 문자열 때문에 추가 공간 O(K)다. 1 1 1 1은 11+11=22이고, 1000000이 들어간 경우는 int 오버플로를 점검하기 좋다.
소스코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws Exception {
solve();
}
public static void solve() throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = in.readLine();
String[] split = str.split(" ");
long num1 = Long.parseLong(split[0] + split[1]);
long num2 = Long.parseLong(split[2] + split[3]);
out.write(num1+num2+"\n");
out.flush();
out.close();;
in.close();
}
}
같은 변환을 직접 구현하면 다음과 같다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws Exception {
solve2();
}
public static void solve2() throws Exception {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = in.readLine();
String[] split = str.split(" ");
long num1 = parseLong(split[0] + split[1]);
long num2 = parseLong(split[2] + split[3]);
out.write(num1+num2+"\n");
out.flush();
out.close();;
in.close();
}
public static long parseLong(String str) {
char[] chs = str.toCharArray();
int length = chs.length;
long exp = 1;
long result = 0;
int i = length -1;
while (i != -1) {
result += (chs[i--] - '0') * exp;
exp *= 10;
}
return result;
}
}