BAEKJOON_1339) 단어 수학
BAEKJOON
# 2019 SW역량테스트준비-연습
# 브루트 포스 # 순열 사용하기
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 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
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 |
댓글
댓글 쓰기