1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | public class Problem016 { private final static int A = 2; private final static int N = 1000; public static void main(String[] args) { System.out.println(run()); } public static String run() { int[] arr = new int[350]; int sum = 0; /*Initialize array by -1*/ for(int i = 0; i < (arr.length - 1); ++i) { arr[i] = -1; } arr[arr.length - 1] = 1; /*Repeat N times*/ for(int i = 1; i <= N; ++i) { /*Multiple A*/ for(int j = (arr.length -1); arr[j] >= 0; --j) { arr[j] *= A; } for(int j = (arr.length -1); (arr[j] >= 0) && (j > 0); --j) { if(arr[j] >= 10) { if(arr[j - 1] < 0) { arr[j - 1] = (arr[j] / 10); } else { arr[j - 1] += (arr[j] / 10); } arr[j] %= 10; } } } for(int i = 0; i < arr.length; ++i) { if(arr[i] != -1) { sum += arr[i]; } } return Integer.toString(sum); } } | cs |
정답: 1366
실행 시간: 10ms = 0.01초
기본적으로 수를 다음의 형태로 본다.
배열에는 각 자리의 수 m 을 저장하고, 지수는 n - index 로 나타낸다.
여기서 n은 배열의 길이다.
따라서 다음과 같은 형태로 표현할 수 있다.
배열의 끝에는 1을 대입하고 나머지 요소들은 -1로 초기화한 후 배열의 끝부터 시작해 요소의 값이 -1이 아닌 요소들에 2를 곱한다. 이는 전체 수에 2를 곱하는 과정과 같다.
각 배열 요소는 자리의 수를 나타내야 하므로 arr[j] )의 값이 두 자리수라면 arr[j] 에는
arr[j] 를 10 으로 나눈 나머지를, arr[j - 1] 에는 arr[j] 를 10 으로 나눈 몫을 넣는다. 단, 이 과정은 -1이 아닌 요소에 한해 수행한다. 여기서 -1은 초기화되지 않은 부분을 나타내므로 건드리면 안 된다.
BigInteger 클래스를 사용하면 더 빠르다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.math.BigInteger; public class Problem016 { private final static int N = 1000; public static void main(String[] args) { System.out.println(run()); } public static String run() { BigInteger num = new BigInteger("2"); int result = 0; num = num.pow(N); while(!num.equals(BigInteger.ZERO)) { result += num.mod(BigInteger.TEN).intValue(); num = num.divide(BigInteger.TEN); } return Integer.toString(result); } } | cs |
실행 시간: 5ms = 0.005초
'Programming > Solutions' 카테고리의 다른 글
[BAEKJOON] 1978번 (0) | 2019.05.02 |
---|---|
[Project Euler] Problem 017 (0) | 2019.04.27 |
[Project Euler] Problem 015 (0) | 2019.04.16 |
[Project Euler] Problem 014 (0) | 2019.04.16 |
[Project Euler] Problem 013 (0) | 2019.04.09 |