경험의 기록

문제 : https://www.acmicpc.net/problem/1339

 

1339번: 단어 수학

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

www.acmicpc.net

 

 

풀이

// [백준] 1339. 단어 수학 (Kotlin)
import java.util.*
import kotlin.math.pow

fun main() = with(Scanner(System.`in`)){
    val n = nextInt()
    var map = mutableMapOf<Char,Int>()
    nextLine()

    for(i in 0 until n){
        val a = nextLine()
        var len = a.length-1

        a.forEach {
            // 자리수 표현
            val tmp = 10f.pow(len)
            // 이미 알파벳이 존재하면 더해줌
            if(map.contains(it)){
                map[it] = map[it]!!.plus(tmp.toInt())
            }
            // 없다면 새로 추가
            else{
                map[it] = tmp.toInt()
            }
            len--
        }
    }

    // 값이 큰 순으로 정렬
    val list  = map.toList().sortedByDescending { it.second }

    var num = 9
    var sum = 0 // 결과값

    // 값이 큰 순으로 알파벳에 큰 숫자 배정
    for(i in 0 until map.size){
        sum += list[i].second * num--
    }

    println(sum)
}

처음에는 가장 긴 수에 큰 수를 부여했는데 그렇게 하게되면

 

ABCD

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

BCC

 

극단적인 예시로  A = 9 부여 되는 것보다 B = 9 부여 되는 것이 더 크므로 방법을 바꿔서 수학으로 풀었다.

 

500 = 5 * 100 처럼 숫자는 한자리수 * 10의 제곱으로 표현할 수 있기 때문에

맵에 알파벳 = 숫자 로 넣고 더해서 큰 수대로 정렬하여

그 알파벳에 9,8,7,6... 을 배정해주면 된다.

 

예제 2 번의 경우로

 

2
GCF
ACDEB

 

라면

A 10000

C 1010

D 100

G 100

E 10

B 1

F 1

 

가 되고 이제 순서대로 9부터 할당해주면

90000

8080

700

600

50

4

3

 

이므로 다 더하면 결과를 얻을 수 있다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading