본문 바로가기
ALGORITHMS/SOLUTION

[백준:PYTHON] 단어 수학

by alasdkfm 2023. 5. 23.

목차

    문제링크 :

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

     

    1339번: 단어 수학

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

    www.acmicpc.net

    문제 :

    # 1339_단어수학
    
    ***
    
    ## 문제 설명
    민식이는 수학학원에서 단어 수학 문제를 푸는 숙제를 받았다.
    
    단어 수학 문제는 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
    ```
    2 
    AAA 
    AAA
    ```
    ### 예제 출력 1 
    1998
    
    
    ### 예제 입력 2 
    ```
    2
    GCF
    ACDEB
    ```
    
    ### 예제 출력 2 
    99437
    
    
    ### 예제 입력 3 
    ```
    10
    A
    B
    C
    D
    E
    F
    G
    H
    I
    J
    ```
    ### 예제 출력 3 
    45

    풀이과정

    내 풀이

    1. 대문자 알파벳(A-Z)을 키로 가지고 있는 딕셔너리 생성 → value값으로 자릿수 저장

         ex. abc → dict[’A’] = 100 , dict[’B’] = 10 , dict[’C’] = 1

     

    2. 딕셔너리에 저장된 value가 가장 큰순서대로, 9~0 부여.

     

    3. 입력받은 문자열을 딕셔너리에 자장된 값과 1:1 매치.

    import sys
    
    num = int(sys.stdin.readline())
    
    alpha_dict = {chr(65+i):0 for i in range(26)}
    lst = []
    for _ in range(num):
        target=sys.stdin.readline()[:-1].upper()
        lst.append(target)
        for j in range(len(target)):
            alpha_dict[target[-1-j]] += (10**j)
           
    sorted_dict = sorted(alpha_dict.items(), key=lambda x: x[1], reverse=True)
    
    for i in range(10):
        alpha_dict[sorted_dict[i][0]] = 9-i
    
    answer = 0
    for i in lst:
        tmp = list(i)
        for j in range(len(i)):
            tmp[j] = str(alpha_dict[tmp[j]])
        print(int("".join(tmp)))
        answer += int("".join(tmp))
           
    print(answer)

     

    다른사람 풀이 1

    1. dict.get()[# dictionary.get() : .get( 키 , 키가 없을경우 출력할 값 ) 함수 사용해서 입력된 문자의 자릿수값 누적 

    2. 자릿수값 * (9 - idx) 해서 결과값 누적

    import sys
    input = sys.stdin.readline
    
    N = int(input())
    alpha = dict()
    
    for _ in range(N):
        word = input().rstrip()
        for i, ch in enumerate(word):
            idx = len(word) - i
            alpha[ch] = alpha.get(ch, 0) + 10**(idx-1)
    
    ans = 0
    for idx, v in enumerate(sorted(alpha.values(), reverse=True)):
        now = (9-idx) * v
        ans += now
    print(ans)

     

    𝚂𝚘𝚞𝚛𝚌𝚎 𝚌𝚘𝚍𝚎

    https://github.com/xnsl291/Algorithms-study/tree/main/BaekJoon/py/Gold4/1339_%EB%8B%A8%EC%96%B4%EC%88%98%ED%95%99Algorithms-study/BaekJoon/py/Gold4/1339_단어수학 at main · xnsl291/Algorithms-study

     

    GitHub - xnsl291/Algorithms-study: 알고리즘 공부하며 풀었던 코드들을 업로드 하는 곳

    알고리즘 공부하며 풀었던 코드들을 업로드 하는 곳 . Contribute to xnsl291/Algorithms-study development by creating an account on GitHub.

    github.com