백준 2935번, 소음

95qwer·2022년 5월 23일
0

A와 B 모두 최대 100자리이므로, 자바 자료형으로 담을 수 없는 숫자가 나올 수 있습니다.
문제에서 +와 * 연산만 진행한다 했으므로 그냥 문자열로 연산자를 그럴 듯하게 따라하게 되었습니다.

+일 경우
같은 수의 덧셈 --> 입력받은 문자열의 0번째 문자를 2로만 변경
다른 수의 덧셈 --> 문자열 길이 비교 후, 큰 문자열을 이용하여 새로운 문자열을 만듭니다.
뒤에서부터 (작은 문자열 길이 - 1) 위치를 0 대신 1 저장.
예를 들어, 1000 + 10인 경우, A[0] = 1, A[1] = 0, ..., A[3] = 0입니다.
여기서 B의 길이는 2이므로, A[3 - B.length -1] = 1로 저장하면, + 연산이 진행된 듯한 효과를 발휘합니다.

*의 경우,
A 혹은 B의 문자열 길이가 1인 경우, 긴 문자를 그대로 반환합니다.

A, B 모두 문자열 길이가 1이 아닌 경우, 즉 1이 아닌 경우에는
StringBuilder에 1을 먼저 저장하고, (A.length-1) + (B.length-1)만큼 반복하며 0을 붙여넣습니다.
이는 10^3 * 10^2 = 10^5 --> 0 최종 5개가 붙는 성질을 이용한 것입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		char[] input1 = bfr.readLine().toCharArray();
		int inputLength1 = input1.length;
		String op = bfr.readLine();
		char[] input2 = bfr.readLine().toCharArray();
		int inputLength2 = input2.length;

		StringBuilder result = new StringBuilder();

		if (op.equals("+")) {
			if (inputLength1 == inputLength2) {
				input1[0] = '2';

				for (char c : input1) {
					result.append(c);
				}
			} else {
				if (inputLength1 > inputLength2) {
					input1[(inputLength1 - 1) - (inputLength2 - 1)] = '1';
					for (char c : input1) {
						result.append(c);
					}
				} else {
					input2[(inputLength2 - 1) - (inputLength1 - 1)] = '1';
					for (char c : input2) {
						result.append(c);
					}
				}
			}
		} else {
			if (inputLength1 == 1 || inputLength2 == 1) {
				if (inputLength1 > inputLength2) {
					for (char c : input1)
						result.append(c);
				} else {
					for (char c : input2)
						result.append(c);
				}
			} else {
				result.append(1);
				for (int i = 0; i < inputLength1 + inputLength2 - 2; i++)
					result.append(0);
			}

		}
		System.out.println(result.toString());
		bfr.close();
	}
}
profile
한땀한땀오타없이

0개의 댓글