-
[백준/BOJ] 4388번 : 받아올림 (JAVA / 자바)백준 2022. 2. 4. 15:02
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/4388
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
이번에 어렵지 않게 풀기는 했으나, 깔끔하게 코드를 짜지도 못했고, 다른 문제들보다 훨씬 지저분하게 풀렸다. 더 정리할 수 있을 것 같을 것이고, 아예 다른 코드로 짜는 것이 좋을 것 같다.
방법은 두가지가 생각났다.
내가 한 방식은 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