티스토리 뷰
출저 : https://www.acmicpc.net/problem/1339
"수학적 접근 혹은 백트래킹"
나는 수학적으로 접근하지 못하고, 백트래킹을 이용했다. 그래서 실행 시간이 오지게 길었다. 그래도 돌긴 도는구나.. Set을 쓰면 더 좋을 것 같은데 iterator 구현이 익숙치 않아서 리스트에서 contains 체크를 했다.
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class Main { static int n; static List<Integer> list = new ArrayList<>(); static int[] values; static char[][] words; static boolean[] visited = new boolean[10]; static int max; static int size; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); words = new char[n][]; for (int i = 0; i < n; i++) { words[i] = br.readLine().toCharArray(); for (int j = 0; j < words[i].length; j++) { if(!list.contains(words[i][j]-65)) { list.add(words[i][j] - 65); } } } size = list.size(); values = new int[list.size()]; solve(0,0); System.out.println(max); } static void solve(int idx, int cnt) { if(size == cnt) { int sum = 0; for (int i = 0; i < n; i++) { int num = 0; for (int j = 0; j < words[i].length; j++) { num *= 10; num += values[list.indexOf(words[i][j]-65)]; } sum += num; } max= Math.max(max, sum); return ; } for (int i = 9; i >= 0; i--) { if(visited[i]) continue; visited[i] = true; values[idx] = i; solve(idx+1,cnt+1); values[idx] = 0; visited[i] = false; } } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 4963. 섬의 개수 :: 돼지개발자 (0) | 2018.12.18 |
---|---|
백준 2174. 로봇 시뮬레이션 :: 돼지개발자 (0) | 2018.12.17 |
백준 2580. 스도쿠 :: 돼지개발자 (0) | 2018.12.17 |
백준 2501. 약수 구하기 :: 돼지개발자 (1) | 2018.12.14 |
백준 16116. 작은 큐브러버 :: 돼지개발자 (0) | 2018.12.14 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday