알고리즘/백준
[BOJ] 1132 - 합 (Java)
DeveloperJason
2023. 8. 14. 15:50
접근법
각 알파벳이 어떤 수를 나타내야 가장 큰 수가 나오게 되는지를 확인하는 문제
충분히 그리디 알고리즘으로도 해결이 되는 문제.
각 알파벳마다 나오는 자릿수만큼을 모조리 더하면 가장 큰 수가 될 수 있는 경우들이 보이게 된다.
합이 높은 수에 높은 수를 배치하게 되면 가장 큰 수가 나올 수 있을 것이다.
문제는 제일 처음 0은 올 수 없다는 점으로 이 부분만 잘 처리해 주면 문제 해결은 어렵지 않다.
코드
package boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BOJ_1132_합 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[] alpha_cnt = new long[10];
for (int i = 0; i < 10; i++) {
alpha_cnt[i] = 0;
}
boolean[] can_zero_arr = new boolean[10];
for (int i = 0; i < 10; i++) {
can_zero_arr[i] = true;
}
for (int i = 0; i < N; i++) {
String alphaNum = br.readLine();
for (int j = alphaNum.length() - 1; j >= 0; j--) {// 뒤에서부터 확인
alpha_cnt[(int) alphaNum.charAt(j) - 65] += (long) Math.pow(10, (alphaNum.length() - 1) - j);
}
can_zero_arr[alphaNum.charAt(0) - 65] = false; // 얘는 처음은 안돼
}
int alphabet_cnt = 0;
for (int i = 0; i < 10; i++) {
if (alpha_cnt[i] > 0)
alphabet_cnt++;
}
if (alphabet_cnt == 10) { // 0이 있어야해
long min_val = Long.MAX_VALUE;
int min_index = -1;
for (int i = 0; i < 10; i++) {
if (can_zero_arr[i] && min_val > alpha_cnt[i]) { // 0이 될 수 있음
min_val = alpha_cnt[i];
min_index = i;
}
}
alpha_cnt[min_index] = 0; // 어차피 곱해봐야 0임
}
long sum = 0;
Arrays.sort(alpha_cnt);
for (int i = 9; i >= 0; i--) {
sum += i * alpha_cnt[i];
}
System.out.println(sum);
}
}
결과
메모리 시간 언어
14268KB | 124ms | Java |