https://www.acmicpc.net/problem/4388
받아올림
1 초 | 128 MB | 2651 | 1030 | 918 | 41.407% |
문제
어린이에게 여러자리 숫자의 덧셈을 가르칠 때는 오른쪽 자리부터 왼쪽으로 하나씩 계산하는 방법을 가르쳐준다. 이때, 받아올림이 발생하게 되며 아이들은 여기서 혼란에 빠진다.
받아올림이란 영어로는 carry라고 하며, 한 자리를 더했을 때, 두 자리라면, 1을 왼쪽 자리로 올려주는 것을 뜻한다.
두 수가 주어졌을 때, 이러한 받아올림이 몇 번 발생하는지 구하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 10자리 이내의 양의 정수 또는 0이 주어진다. 입력의 마지막 줄에는 0 0이 있다.
출력
각 테스트 케이스에 대해서, 입력으로 주어진 두 수를 더할때 나오는 받아올림의 개수를 출력한다.
예제 입력 1 복사
123 456
555 555
123 594
0 0
예제 출력 1 복사
0
3
1
풀이 :
처음에는 문제를 대충 보고 3자리 수끼리만 더하는 줄 알고 쉽네~ 하고 풀었다가 틀렸다. 하하
짜증남의 흔적...ㅎ
먼저 숫자를 char 로 쪼갠다.
그리고 올림을 한 횟수를 담을 carryCount, 올림수 carry를 int로 선언한다.
그리고 char로 받은 숫자들(digit1, digit2)을 int로 변환하여 ( '0'을 빼주어 char 숫자 -> int 숫자로 변형)
digit1과 digit2 를 index 큰 수에서부터 비교한다.
digit 들의 각 자리 수 합과 올림 수 carry 의 합이 10 이상이면 carryCount는 1 증가하는 형태.
* '0' 을 빼주는 이유 :
예를 들어 똑같은 1이 있다 해도 char 은 문자열 형태의 '1'이다.
지금 구해야 하는 것은 int 형식의 1이므로 변환 작업이 필요한데, 아스키 코드 원리를 생각하면 쉽게 구할 수 있다.
문자열 '0' 의 아스키 코드 값은 정수형 48.
문자열 '1' 의 아스키 코드 값은 정수형 49 이다.
문자열 -'0' 을 해주면 결국 49-48이 되니까 int 1을 구할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String[] input = br.readLine().split(" ");
int number1 = Integer.parseInt(input[0]);
int number2 = Integer.parseInt(input[1]);
if (number1 == 0 && number2 == 0) {
break;
}
char[] digits1 = String.valueOf(number1).toCharArray();
char[] digits2 = String.valueOf(number2).toCharArray();
int maxLength = Math.max(digits1.length, digits2.length);
int carryCount = 0;
int carry = 0;
for (int i = 0; i < maxLength; i++) {
int digit1 = i < digits1.length ? digits1[digits1.length - i - 1] - '0' : 0;
int digit2 = i < digits2.length ? digits2[digits2.length - i - 1] - '0' : 0;
int sum = digit1 + digit2 + carry;
if (sum >= 10) {
carryCount++;
carry = 1;
} else {
carry = 0;
}
}
System.out.println(carryCount);
}
}
}
입력된 숫자를 자리수별로 하나하나 쪼개는 과정에서 너무 복잡하게 푼 것 같아서
이번에는 10 나누기와 나머지를 이용하여 답을 구해보았다.
입력된 숫자 a, b를 10으로 나눈 나머지를 구하면 일의 자리수가 나온다.
그리고 a,b를 계속해서 10으로 나눈 몫을 구하면 한 자리씩 올라가는 수를 구할 수 있다.
역시나 받아올린 개수, 받아올린 수를 받을 int를 선언해주었다.
위와 아래 코드 모두 정답이긴 하나, 아래 코드가 더 간단한 것 같아서 마음에 든다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (a == 0 && b == 0) {
break;
}
int cnt = 0;
int carry = 0;
while (a > 0 || b > 0) {
int sum = (a % 10) + (b % 10) + carry;
if (sum >= 10) {
cnt++;
carry = 1;
} else {
carry = 0;
}
a /= 10;
b /= 10;
}
System.out.println(cnt);
}
}
}
'알고리즘 문제풀이 > Beakjoon' 카테고리의 다른 글
백준 3507. Automated Telephone Exchange (JAVA) (0) | 2023.02.23 |
---|---|
백준 2783. 삼각 김밥 (JAVA) (1) | 2023.02.22 |
백준 3059. 등장하지 않는 문자의 합 (JAVA) (0) | 2023.02.17 |
백준 2985. 세 수 (JAVA) (0) | 2023.02.13 |
백준 5753. Pascal Library (feat. Chat GPT) (0) | 2023.02.11 |