BAEKJOON_1339) 단어 수학

1339) 단어 수학 (19.10.07)








* s[i]에 각 줄에 입력된 string을 저장.
* ch[i]로 어떤 알파벳이 입력됐는지 확인, 입력된 알파벳 종류의 수를 확인.
* che[i]로 입력된 알파벳의 자리에 해당하는 값을 입력, 이전순열로 돌리면서 계속 바꿔줌.
* ans[i]에 입력된 숫자들을 이전순열로 돌리고, che[i]의 해당 자리에 값을 넣어줌.
* before()은 이전순열, putnum()은 돌린 순열을 알파벳에 각각 지정.

* 아래 코드는 sum[i]를 string으로 입력받아서 문자열을 int형으로 변환해서 더해주는 방법.
* sumarr() 함수를 사용했다. => 런타임에러
* 배열 범위나 값은 맞게 들어간거 같은데 런타임 에러면 반복문이 너무 길어져서 그런가 싶기도하고

* 처음에 문제에서 최대 8자리라는 것을 못보고 10자리로 다 했을 때 값이 오버되는것을 발견
* int -> double 로 바꾸고 출력했는데 소수점 포함해서 나오길래 찾아보니
* BigDecimal 이라는 것이 있었다. (참고 링크)



* 근데 이거 바꿔도 런타임 에러 계속 나길래 반복문 문제라고 생각하고 방법 수정.

https://www.acmicpc.net/board/view/22980
* 백준에서 런타임에러가 발생하는 이유가 나와있는 게시글을 발견.

* 그래서 string말고 int로 받아서 바로 자리수대로 더해주는 방식으로 변경해서 통과했다.

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import java.io.*;

class Main{
    public static boolean check = false;
    public static int[] num = {9876543210};
    public static void swap(int a, int b, int[] mxarr) {
        int s = mxarr[a];
        mxarr[a] = mxarr[b];
        mxarr[b] = s;
    }
    public static void before(int[] mxarr, int k) {
        int p = -1;
        for(int i=k-1;i>0;i--) {
            if(mxarr[i-1> mxarr[i]) {
                p = i-1;
                break;
            }
        }
        if(p<0) {
            check=true;
            return;
        }
        for(int i=k-1;i>p;i--) {
            if(mxarr[p]>mxarr[i]) {
                swap(p, i, mxarr);
                break;
            }
        }
        
        int q = k-1;
        for(int i=p+1;i<=k;i++) {
            if(i<q) {
                swap(i, q, mxarr);
                q = q-1;
            }
        }
    }
    public static int sumarr(String[] sum, int n) {
        int s = 0;
        for(int i=0;i<n;i++) {
            s = s+Integer.parseInt(sum[i]);
        }
        
        return s;
    }
    public static void putnum(boolean[] ch, int[] che, int[] ans) {
        int j = 0;
        for(int i=0; i<26; i++) {
            if(ch[i]) {
                che[i] = ans[j];
                j = j+1;
            }
        }
    }
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        
        String[] s = new String[n];
        for(int i=0;i<n;i++){
            s[i] = br.readLine();
        }
        
        boolean[] ch = new boolean[26];
        int[] che = new int[26];
        for(int i=0;i<n;i++) {
            int t = s[i].length();
            for(int j=0;j<t;j++) {
                int k = s[i].charAt(j)-'A';
                ch[k] = true;
                bw.write("k : "+ k + "   ");
            }
        }
        
        int cnt = 0;
        for(boolean r : ch) {
            if(r) cnt = cnt+1;
        }
        
        int[] ans = new int[cnt];
        for(int i=0;i<cnt;i++) {
            ans[i] = num[i];
        }
        int max = 0;
        String[] sum = new String[n];
        while(true) {
            putnum(ch, che, ans);
            
            for(int i=0;i<n;i++) {
                int t = s[i].length();
                sum[i] = "";
                for(int q=0;q<t;q++) {
                    int k = s[i].charAt(q)-'A';
                    sum[i] = sum[i] + che[k];
                }
            }
            
            if(max<sumarr(sum, n)) max = sumarr(sum, n);
            
            before(ans, cnt);
            
            if(check) break;
        }
        
        bw.write(String.valueOf(max));
        bw.flush();
        bw.close();
    }
}
cs

댓글

이 블로그의 인기 게시물