알고리즘 문제풀이/백준
Baekjoon_1339_단어 수학
Treejin
2020. 12. 19. 21:42
반응형
문제 설명
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
- 주어지는 수는 알파벳으로 이루어져있음
- 알파벳 당 한자리 숫자(9~0) 할당
- EX. ABC => A = 9, B = 8, C = 7 => 987
=> 주어지는 알파벳 수의 합의 최대값 출력
문제 풀이
이 문제를 보고 처음 생각한 풀이 방법은 높은 자리에 있는 알파벳에 높은 숫자를 할당하는 방식이었다.
하지만 이 방식은 틀린 방식이었다. 예를 들어 AB + BB + BB 의 연산이 있을 경우 A에 9, B에 8을 할당한 것보다 A에 8, B에 9를 할당하는 것이 더 큰 계산결과가 나오기 때문이다.
그 후 생각한 풀이 방법은 각 알파벳의 자리수 값을 다 더하는 것이었다.
이 문제에서는 모든 수의 합을 구하기 때문에 ABC + DE 와 ADE + BC의 계산 결과는 같다.
따라서 ABC => A = 100, B = 10, C = 1, DDE => D = 110, E = 1처럼 자리수 값을 (알파벳, 자리수의 합)으로 저장하고, 이 중 자리수의 합 값이 큰 순서대로 큰 수를 할당했다.
문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.PriorityQueue;
public class _1339_단어수학 {
static class Node implements Comparable<Node>{
char alpha;
int num;
Node(char alpha, int num){
this.alpha = alpha;
this.num = num;
}
@Override
public int compareTo(Node o) {
return o.num - this.num;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(in.readLine());
HashMap<Character, Integer> map = new HashMap<>();
char[][] strings = new char[N][];
for (int i = 0; i < N; ++i) { //각 알파벳의 자리값 계산
strings[i] = in.readLine().toCharArray();
int pos = strings[i].length - 1;
for (int j = 0; j < strings[i].length; ++j) {
int num = map.containsKey(strings[i][j])?map.get(strings[i][j]):0; //이미 저장된 값이면 저장된 것 가져오기, 아니면 0
map.put(strings[i][j], num + (int)Math.pow(10, pos--)); //자릿수 값 더해서 해시맵에 넣기
}
}
PriorityQueue<Node> pq = new PriorityQueue<>();
Iterator<Character> iter = map.keySet().iterator();
while(iter.hasNext()) { //알파벳과 자리값 정보 가지는 Node를 우선순위 큐에 넣어서 정렬
char alpha = iter.next();
int num = map.get(alpha);
pq.add(new Node(alpha,num));
}
int num = 9;
while(!pq.isEmpty()) { //자리값이 큰 알바벳부터 큰 수 할당
Node n = pq.poll();
map.put(n.alpha, num--);
}
int sum = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; ++i) { //할당받은 수에 따른 계산 수행
for (int j = 0; j < strings[i].length; ++j) {
sb.append(map.get(strings[i][j]));
}
sum += Integer.parseInt(sb.toString());
sb.setLength(0);
}
System.out.println(sum);
}
}
반응형