문제 링크 : https://www.acmicpc.net/problem/1339
문제 등급 : Gold IV
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
입력
2
GCF
ACDEB
문제 해결 로직
- 알파벳이 들어갈 배열 생성
- 각 문자열의 알파벳을 문자형으로 받고 배열의 해당 문자의 위치에 자릿수를 삽입한다.
- A의 경우 'A'를 뺄셈 하여 0번을 받는다.
- A의 위치의 값이 0이 아니면 A의 값과 더해주고 값이 0이라면 A에 값을 삽입한다.
- 위와 같이 자릿수를 구하면 A = 10000, C = 1000, D = 100, E = 10, B = 1, G = 100, C = 10, F = 1과 같이 자릿수를 구할수 있다.
- C의 경우 앞에서 1000 넣어 최종적으로 C = 1010이 된다.
- 자리수를 구한 배열을 내림 차순으로 정렬한다.
- 정렬된 배열에서 가장 큰 값인 9부터 0까지 배열의 요소와 곱한다.
- 반복문을 돌면서 최대 값을 구한다.
이 문제를 분석했을 때 전체 탐색으로 풀려고 하였다. 하지만 전체 탐색으로 푸는 법도 막막하여 풀이를 찾아보았다.
전체 탐색하면 시간 초과가 발생하여 전체 탐색을 하지 않고 자릿수를 구해 최댓값을 구하는 풀이를 보았다.
이 문제는 아주 그리디스러운 문제라는 걸 느꼈다.
아래와 같이 소스를 공유합니다.
public class 단어 수학 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] ap = new int[26];
for(int i = 0; i < n; i++) {
char[] str = sc.next().toCharArray();
for (int j = 0; j < str.length; j++) {
int pow = (int) Math.pow(10, str.length - j - 1);
char c = str[j];
int s = str[j] - 'A';
if(ap[s] != 0){
ap[s] += pow;
}else {
ap[s] = pow;
}
}
}
int sum = 0;
// 0 제거 후 내림차순으로 정렬
List<Integer> list = Arrays.stream(ap).boxed().filter((item) -> item != 0).sorted(Collections.reverseOrder()).collect(Collectors.toList());
for(int i = 0; i < list.size(); i++) {
sum += list.get(i) * (9 - i);
}
System.out.println(sum);
}
}
'알고리즘 > 문제풀이 - 백준온라인저지' 카테고리의 다른 글
[BOJ 그리디] 주유소 13305.JAVA (0) | 2021.07.10 |
---|---|
[BOJ 그리디] 수들의 합 1789.JAVA (0) | 2021.07.04 |
[BOJ 문자열] 괄호 9012.JAVA (0) | 2021.07.04 |
[BOJ 그리디] 신입사원 1946.JAVA (0) | 2021.07.02 |
[BOJ 그리디] 로프 2217.JAVA (0) | 2021.07.01 |