알고리즘 문제풀이/Beakjoon

백준 4388. 받아올림 (JAVA)

joah.k 2023. 2. 17. 17:59
728x90

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

 

4388번: 받아올림

어린이에게 여러자리 숫자의 덧셈을 가르칠 때는 오른쪽 자리부터 왼쪽으로 하나씩 계산하는 방법을 가르쳐준다. 이때, 받아올림이 발생하게 되며 아이들은 여기서 혼란에 빠진다. 받아올림이

www.acmicpc.net

 

받아올림 

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
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);
        }
    }
}

 

728x90