성장, 그 아름다운 향연

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

 

1339번: 단어 수학

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

www.acmicpc.net

 

 

문제

민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다.

단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다. 이때, 각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제이다. 같은 알파벳은 같은 숫자로 바꿔야 하며, 두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다.

예를 들어, GCF + ACDEB를 계산한다고 할 때, A = 9, B = 4, C = 8, D = 6, E = 5, F = 3, G = 7로 결정한다면, 두 수의 합은 99437이 되어서 최대가 될 것이다.

N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 주어진 단어의 합의 최댓값을 출력한다.

 


 

접근 방법

 

백준 강의 중에서 순열 파트에서 나온 문제여서 순열로 어떻게 푸는지 알려줬지만,

그리디 알고리즘으로도 풀어보고 싶었다.

그래서 인터넷 검색을 해봤더니 대부분 수학의 자릿수를 이용했다.

 

 

1) GCF + ACDEB 일 때,

 

ACDEB = 10000A + 1000C + 100D + 10E + 1B

GCF = 100G + 10C + 1F

 

 

2) 이를 더한다.

 

10000A + 1010C + 100D + 10E + 1B + 100G + 1F

 

 

3) 수의 합을 최대로 만들어야 하기 때문에 정렬한 후, 가장 큰 값부터 차례대로 9-0까지 넣는다.

 

10000A + 1010C + 100D + 100G + 10E + 1B + 1F

(A = 9, C = 8, D = 7, G = 6, E = 5, B = 4, F = 3)

 

= 90000 + 8080 + 700 + 600 + 50 + 4 + 3

= 99437

 

 

전체 코드

 

lateinit var arr : Array<String>
val alpha = IntArray(26)
var n = 0

fun main() = with(System.`in`.bufferedReader()) {
    n = readLine().toInt()
    arr = Array(n) {readLine()}

    greedy()
    alpha.sortDescending()
    println(findAnswer())
}

private fun greedy() {
    for(i in arr.indices) {
        var pow = 1
        for(j in arr[i].length -1 downTo 0) {
            alpha[arr[i][j] - 'A'] += pow
            pow *= 10
        }
    }
}

private fun findAnswer() : Int {
    var num = 9
    var res = 0
    for(item in alpha) {
        if(item == 0) break

        res += item *num
        num--
    }
    return res
}

'algorithm > 그리디 알고리즘' 카테고리의 다른 글

백준 17521) Byte Coin [kotlin, java]  (0) 2021.06.12
백준 9329) 패스트 푸드 상금  (0) 2021.06.09
백준 1449) 수리공 항승  (0) 2021.06.08
백준 13413) 오셀로 재배치  (0) 2021.06.01
백준 2217) 로프  (0) 2021.06.01
profile

성장, 그 아름다운 향연

@dev_minoflower

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...