-
[백준/BOJ] 4388번 : 받아올림 (JAVA / 자바)백준 2022. 2. 4. 15:02
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/4388
4388번: 받아올림
어린이에게 여러자리 숫자의 덧셈을 가르칠 때는 오른쪽 자리부터 왼쪽으로 하나씩 계산하는 방법을 가르쳐준다. 이때, 받아올림이 발생하게 되며 아이들은 여기서 혼란에 빠진다. 받아올림이
www.acmicpc.net
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
이번에 어렵지 않게 풀기는 했으나, 깔끔하게 코드를 짜지도 못했고, 다른 문제들보다 훨씬 지저분하게 풀렸다. 더 정리할 수 있을 것 같을 것이고, 아예 다른 코드로 짜는 것이 좋을 것 같다.
방법은 두가지가 생각났다.
내가 한 방식은 StringBuilder로 입력값을 받고 그 값을 reverse로 반전을 시켜 String에 저장한다.(이유는 두 값의 길이가 다를 수 있는 경우엔 문자열로 받고 charAt으로 인덱스 값을 받아와야하는데 서로 다른 인덱스 값으로 계산하게 되면 코드가 더 길어질거라 생각되어서다.) 그렇게 String에 저장해서 반복문으로 통해 각 자리마다 더해서 10 이상이 되면 다음 수에 1을 더하고 만들어둔 count 변수에 1을 더해준다. 반복문이 끝나면 count를 출력하면 받아올림 한 횟수가 출력된다.
다른 방법은 간단히 말해서 나누기 10의 배수를 해서 몫을 구하거나 나머지를 구하는 것이다.
-풀이-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; 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()); StringBuilder sb = new StringBuilder(st.nextToken()); String N = sb.reverse().toString(); sb = new StringBuilder(st.nextToken()); String M = sb.reverse().toString(); //각 반전시킨 문자열들의 길이 저장 int Nsize = N.length(); int Msize = M.length(); //0 0입력 시 무한루프 종료 if(N.equals("0") && M.equals("0")) { break; } //num : 해당 자릿수들의 합이 10이상이 나오면 다음 수에 더하기 위한 변수 //count : 받아올림 횟수를 체크하기 위한 변수 int num = 0; int count = 0; //두 문자열의 길이중 긴 길이만큼 반복, 짧은 길이의 +1만큼만 해도 된다. for(int i = 0; i < Math.max(Nsize, Msize); i++) { //문자열의 자릿수에 오는 값을 int형으로 변환시켜서 연산하기 위한 변수 int n = 0; int m = 0; //현재 연산할 자릿수가 아직 길이가 짧은 문자열의 길이를 넘지 않았으면 둘다 연산 if(i < Math.min(Nsize, Msize)) { n = N.charAt(i) - '0'; m = M.charAt(i) - '0'; //현재 연산할 자릿수가 아직 길이가 짧은 문자열의 길이를 넘었으면 길이가 긴 값만 연산 }else { //삼항연산자로 길이가 긴 값의 자릿값을 구함. if문으로 해도됨. n = (Math.max(Nsize, Msize) == Nsize) ? N.charAt(i) - '0' : M.charAt(i) - '0'; } //두 자릿수와 이전 자릿수의 10이상 여부에 따른 num값을 더했을때 10이상이면 //num에 1저장하고, count에 1을 더한다. if((n + m + num) >= 10) { num = 1; count++; //두 자릿수와 num값을 더했을때 10미만이면 num에 0 저장 }else { num = 0; } } System.out.println(count); } } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 4504번 : 배수 찾기 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4493번 : 가위 바위 보? (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 4153번 : 직각삼각형 (JAVA / 자바) (0) 2022.02.04 [백준/BOJ] 3029번 : 경고 (JAVA / 자바) (0) 2022.02.03 [백준/BOJ] 4101번 : 크냐? (JAVA / 자바) (0) 2022.02.03