BOJ #1339

LSM ·2021년 7월 31일
0


LEVEL :

Gold4


문제 요약 :

같은용량의 물병을 합쳐 k개 이하로 만들어야 할 때 추가로 구매해야 하는 물병의 갯수는?


해결 방안 :

제일 처음에는 문자열의 길이를 기준으로 정렬을 한 뒤, 순서대로 높은 숫자를 부여하면 가장 큰 조합을 만들 수 있을 줄 알았다.
그렇게 푼 결과 오답이 나왔고 질문검색에서 반례를 보니 큰 실수를 했음을 알았다.
ex)
N=10
ABB
BB
BB
BB
BB
BB
BB
BB
BB
BB
일때, A=9 이고, B=8 이면 오답이다.
결구 백트레킹을 통해 문제를 해결 해야 함을 알았고,
문자열을 입력받을때, 문자열의 각 문자가 몇번 반복되고, 몇번째 자리수인지를 기록하는 배열을 만들어 9부터 넣어 가장큰 조합을 만들어 내는 알파벳을 찾고 해당 알파벳을 체크하여 넘어가는 방식으로 진행하였다.


시간 복잡도 :

1000번미만의 비교로 문제를 해결할 수있다.


Solution

import sys
input = sys.stdin.readline
if __name__ == "__main__" :
    n = int(input().strip())
    alpha = []
    arr = []
    for i in range(n) :
        s = input().strip()
        for i in range(len(s)) :
            try :
                alpha_idx = alpha.index(s[i])
                idx = len(s)-i-1
                arr[alpha_idx][idx] += 1
            except :
                alpha.append(s[i])
                idx = len(s)-i-1
                new = [0]*8
                new[idx] += 1
                arr.append(new)
    visited = [False]*len(alpha)
    res= 0
    for i in range(9,-1,-1) :
        m = 0
        max_idx = -1
        for j in range(len(alpha)) :
            if visited[j] == True :
                continue
            sum_alpha = 0
            each_arr = arr[j]
            for k in range(8) :
                if each_arr[k] == 0 :
                    continue
                sum_alpha += (10**k)*each_arr[k]*i
            if sum_alpha > m :
                m = sum_alpha
                max_idx = j
        res += m
        visited[max_idx] = True
    print(res)
profile
개발 및 취준 일지

0개의 댓글