티스토리 뷰

출저 : 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







댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday