happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Patch
  • kubernetes
  • 18
  • 15
  • replace
  • apply
  • edit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

[python] 백준 > 그리디 > 단어 수학(1339)
알고리즘/알고리즘 문제

[python] 백준 > 그리디 > 단어 수학(1339)

2021. 2. 4. 13:53

[문제]

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

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

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

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

 

www.acmicpc.net/problem/1339

 

1339번: 단어 수학

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

www.acmicpc.net

[풀이]

import sys
input = sys.stdin.readline

N = int(input())
words = [list(input().rstrip()) for _ in range(N)]

word_dict = {}

for word in words:
    k = len(word)-1
    for w in word:
        if w in word_dict:
            word_dict[w] += 10 ** k
        else:
            word_dict[w] = 10 ** k
        k -= 1

sorted_word = sorted(word_dict.values(), reverse=True)
answer, num = 0, 9
for sw in sorted_word:
    answer += sw * num
    num -= 1
print(answer)
  • 단어의 스펠을 하나씩 꺼내 1의자리 숫자인지 10의 자리 숫자인지 10의 n승의 자리 숫자인지 확인한 후 같은 스펠링을 가지고 있으면 더해준다.
  • 그리디 방식을 통해 가장 큰 값부터 9부터 곱해준다

[다른 사람의 풀이]

import sys
input = sys.stdin.readline
t = int(input())
words = [input().strip() for _ in range(t)]
importance = {}
for word in words:
    for idx, w in enumerate(word[::-1]):
        if not importance.get(w,0):
            importance[w] = 10**idx
        else:
            importance[w] += 10**idx
tmp = sorted(list(importance.items()), key=lambda x: x[1],reverse=True)
alpha_to_idx = {a:9-idx for idx, (a,b) in enumerate(tmp)}
score = 0
for word in words:
    for idx, w in enumerate(word[::-1]):
        score += alpha_to_idx[w]*10**(idx)
print(score)

 

'알고리즘 > 알고리즘 문제' 카테고리의 다른 글

[python] 백준 > 이분 탐색 > 숫자 카드(10815)  (0) 2021.02.04
[python] 백준 > 이분 탐색 > 두 용액(2470)  (2) 2021.02.04
[python] 백준 > 이분 탐색 > 수 찾기(1920)  (0) 2021.02.03
[python] 백준 > 이분 탐색 > 랜선 자르기(1654)  (0) 2021.02.03
[python] 백준 > 다익스트라 > 최단 거리(1753)  (0) 2021.02.02
    '알고리즘/알고리즘 문제' 카테고리의 다른 글
    • [python] 백준 > 이분 탐색 > 숫자 카드(10815)
    • [python] 백준 > 이분 탐색 > 두 용액(2470)
    • [python] 백준 > 이분 탐색 > 수 찾기(1920)
    • [python] 백준 > 이분 탐색 > 랜선 자르기(1654)
    happyso
    happyso

    티스토리툴바