-
2231번 - 분해합알고리즘/백준 2023. 2. 26. 20:17
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)); int N = Integer.parseInt(br.readLine()); for(int i=1;i<N;i++) { int pos_sum = 0; int self = i; int logarithm = (int)Math.log10(i); while(logarithm >= 0) { pos_sum += (self / (int)Math.pow(10, logarithm)); self = self % (int)Math.pow(10, logarithm); logarithm--; } if(pos_sum + i == N) { System.out.println(i); System.exit(0); } } System.out.println(0); br.close(); } }
이 문제는 위 방법 대신 문자열의 각 자리를 숫자로 바꾸는 것을 추천드립니다.
위 방법은 948ms가 나오는 등 시간 차이가 매우 큽니다.
해결 아이디어는 다음과 같습니다.
1. N이 50만까지이므로 브루트 포스 방법 이용(1부터 자기 자신-1까지 모든 수를 테스트합니다.)
2. 상용로그의 진수를 이용해 각 자릿수의 숫자를 추출해 더합니다.(pos_sum)
3. 자기 자신(i)과 자릿수 합(pos_sum)을 더한 값이 N과 같으면 해당 i(최솟값)을 출력하고 프로그램을 종료합니다.
4. 해당하는 i가 없을 경우(for문이 출력 없이 끝난 경우) 0을 출력합니다.
2번이 조금 성가신 데 126이라 하면 10의 2승으로 나눈 1을 더하고 나머지인 26을 다시 갖다가 10의 1승으로 나누는 식입니다. 이 부분을 그냥 문자열 추출로 처리하면 매우 빨라질 것으로 보입니다.
'알고리즘 > 백준' 카테고리의 다른 글
2609번 - 최대공약수와 최소공배수 (0) 2023.03.01 1459번 - 걷기 (0) 2023.02.28 2292번 - 벌집 (0) 2023.02.27 2108번 - 통계학 (0) 2023.02.26 1978번 - 소수 찾기 (0) 2023.02.26