티스토리 뷰
출저 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4yC3pqCegDFAUx
"와 어려웠다.인수분해"
처음엔 0~9 까지 숫자를 눌러 X를 구하려고 했다. 굉장히 구현이 잘 되지 않았다.
1 = 1
1*1 = 1
1*1*1 = 1
이런 경우 어떻게 처리할까..
그래서.
약간의 기초적인 수학적인 지식이 필요했다. 어떤 수들을 곱해서 X가 만들어 졌고, X를 계속 인수분해 하다보면 계산기를 눌러 가능한 a * b *.. *... * 의 형태로 나올 것이다..
따라서 해당 문제에서는 주어진 X값을 인수분해 하여 해당 a * b 의 형태로 바꾼 후에, a와 b를 계산기로 칠 수 있는지 확인하고, 그렇지 않다면 다시 solve(a) + solve(b) 의 형태로 재귀적 호출을 한다.
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Solution { static int T,X; static int[] buttons = new int[10]; static int dp[]; static final int IMPOSSIBLE = Integer.MAX_VALUE; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); T = Integer.parseInt(br.readLine()); int t = 1; while(T-- > 0) { StringTokenizer st = new StringTokenizer(br.readLine()); for (int i = 0; i < 10; i++) { buttons[i] = Integer.parseInt(st.nextToken()); } X = Integer.parseInt(br.readLine()); // X가 10 이하일 수 있으므로... dp = new int[X+10]; for (int i = 0; i < 10; i++) { if(buttons[i] == 1) { dp[i] = 1; } } solve(X); System.out.printf("#%d %d\n",t++,dp[X] == IMPOSSIBLE ? -1 : dp[X]+1); } } static int solve(int num) { if(dp[num] != 0) return dp[num]; // num을 직접 눌러본다, 만약 고장난 숫자가 포함되어 있어 누르지 못한면 Integer.MAX_VALUE 를 return 한다. dp[num] = count(num); // 인수분해하여 num = a * b 의 형태로 변환 for (int i = 1; i <= (int)Math.sqrt(num); i++) { if(num % i == 0) { int num1 = solve(i); int num2 = solve(num/i); // 직접 번호를 누른 숫자와, 인수분해한 a * b 를 각각 다시 탐색 // *를 눌렀기 때문에 +1 해준다. dp[num] = Math.min(dp[num], num1 == IMPOSSIBLE || num2 == IMPOSSIBLE ? IMPOSSIBLE : num1+num2 + 1); } } return dp[num]; } static int count(int num) { int cnt = 0; while(num > 0) { int temp = num % 10; if(buttons[temp] == 0) return IMPOSSIBLE; num /= 10; cnt++; } return cnt; } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
SWEA 1248. 공통조상 :: 돼지개발자 (0) | 2019.02.14 |
---|---|
SWEA 2112. 보호 필름 :: 돼지개발자 (0) | 2019.02.14 |
SWEA 4050. 재관이의 대량 할인 :: 돼지개발자 (0) | 2019.02.10 |
백준 2026. 소풍 :: 돼지개발자 (0) | 2019.02.08 |
백준 1389. 케빈 베이컨의 6단계 법칙 :: 돼지개발자 (0) | 2019.02.07 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday