문제
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net

풀이
이 문제에서는 각 알파벳에 가중치를 계산하고, 그 가중치에 따라 알파벳에 숫자를 할당해주어 계산하면 최대값이 계산된다.
먼저 26개의 알파벳에 대한 가중치를 저장하는 배열을 선언한다. 입력받은 문자열에서 각 알파벳의 자릿수에 따라 10의 배수로 가중치를 부여한다. 예를 들어 예제 입력 2에서 GCF는 G: 100, C: 10, F: 1,의 가중치가 부여되고, ACDEB는 A: 10000, C: 1000, D: 100, E: 10, B: 1의 가중치를 부여되어 알파벳 배열에 저장한다.
이후 알파벳 배열을 오름차순으로 정렬한다. 정렬된 배열을 기반으로 각 알파벳에 할당된 가중치를 순서대로 9부터 0까지 곱하여 더하면 최대값을 얻을 수 있다. 예제 입력 2의 경우에 가중치 순서로 정렬하면 A(10000), C(1010), D(100), G(100), E(10), B(1), F(1) 가 되고 순서대로 숫자를 할당하면 90000 + 8080 + 700 + 600 + 50 + 4 + 3 이 되어 99,437이 답이 된다. 또한 예제 입력의 문자열에서 GCF + ACDEB = 683 + 98754 = 99437이 되어 정답인 것을 확인할 수 있다.
코드
fun main() { val br = System.`in`.bufferedReader() val bw = System.out.bufferedWriter() val num = br.readLine().toInt() val arr = Array(num) { br.readLine() } val alphabet = IntArray(26) for (i in 0 until num) { var tmp = 1 for (j in arr[i].length - 1 downTo 0) { alphabet[arr[i][j].code - 65] += tmp tmp *= 10 } } alphabet.sort() var idx = 9 var sum = 0 for(i in 25 downTo 0) { if(alphabet[i] == 0) break sum += alphabet[i]*idx-- } bw.write("$sum") bw.flush() bw.close() br.close() }
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 13023번: ABCDE - Kotlin[코틀린] (0) | 2023.12.16 |
---|---|
[백준] 2669번: 직사각형 네개의 합집합의 면적 구하기 - Kotlin[코틀린] (0) | 2023.12.13 |
[백준] 2346번: 풍선 터트리기 - Kotlin[코틀린] (0) | 2023.12.11 |
[백준] 2504번: 괄호의 값 - Kotlin[코틀린] (0) | 2023.12.05 |
[백준] 4485번: 녹색 옷 입은 애가 젤다지? - Kotlin[코틀린] (0) | 2023.11.30 |