-
[백준/BOJ] 5692번 : 팩토리얼 진법 (JAVA / 자바)백준 2022. 2. 6. 21:38
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/5692
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
테스트 케이스의 수가 정해지지않았기 때문에 무한루프를 사용.
0 입력시 무한루프 종료.
여기서 말하는 기법이란 말그대로 719로 예를들면 (7 * 3 * 2 * 1) + (1 * 2 * 1) + (9 * 1)이다.
3 2 1 / 2 1 / 1 은 해당 자릿수 팩토리얼이다. 1은 곱하는 것에 의미가 없기때문에 코드에서는 뺀다.
처음에 기본 반복문마다 print를 해줬는데 시간이 좀 높게 나왔다. 그래소 StringBuilder를 이용해 출력해줄 값들을 저장해서 마지막에 한번에 출력해줬다. 그러니 시간이 많이 줄었다.(BufferedWriter를 이용해도 된다.)
코드는 StringBuilder만 올리고, 결과에 두가지 다 올리겠다.
-풀이-
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)); //결과값을 저장할 StringBuilder StringBuilder sb = new StringBuilder(); //무한루프 while(true) { String S = br.readLine(); //S의 길이 int size = S.length(); int sum = 0; //0입력시 종료 if(S.equals("0")) break; //문자열 0인덱스부터 마지막인덱스까지 반복하는 반복문 for(int i = 0; i < S.length(); i++) { int n = S.charAt(i) - '0'; //숫자 1을 곱해주는 의미가 없기때문에 2부터 시작 //범위를 S.length()가 아닌 size로 정의한 이유는 자릿수가 //넘어갈 수록 곱해줄 최댓값도 줄어들어야하기 때문이다. for(int j = 2; j <= size; j++) { n *= j; } sum += n; size--; } //여기서 출력해도 문제는 풀 수 있지만 시간이 오래 걸린다. //System.out.println(sum); //그러니 StringBuilder를 사용한다. sb.append(sum).append("\n"); } //저장해준 결과값을 출력한다. System.out.println(sb); } }
-결과-
딱봐도 속도의 차이가 7배는 나고, 메모리도 상당히 많이 난다.
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 6609번 : 모기곱셈 (JAVA / 자바) (0) 2022.02.07 [백준/BOJ] 6378번 : 디지털 루트 (JAVA / 자바) (0) 2022.02.06 [백준/BOJ] 6322번 : 직각 삼각형의 두 변 (JAVA / 자바) (0) 2022.02.06 [백준/BOJ] 6131번 : 완전 제곱수 (JAVA / 자바) (0) 2022.02.06 [백준/BOJ] 5717번 : 상근이의 친구들 (JAVA / 자바) (0) 2022.02.06