세상을 바꾸는 데이터

[백준 1339번] 단어수학 - 파이썬 본문

PS Study/BOJ(백준)

[백준 1339번] 단어수학 - 파이썬

Industriousness 2022. 1. 23. 12:34

문제 링크:

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

 

1339번: 단어 수학

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

www.acmicpc.net

 

문제 풀이:

  • 입력받은 각 단어들이 위치하고 있는 값을 알파벳마다 입력해준다.

먼저 빈 리스트를 영어 알파벳 개수만큼 생성해주고 값을 0으로 채운다.

ACE = 100 * A + 10 * C + 1 * E 가 있다고 하면,

alpha[A] = 100, alpha[C] = 10, alpha[E] = 1을 빈 리스트에 더해주면 된다.

 

예를 들어

ACE + EBDF 문제가 있다고 하자.

ACE에서 alpha[A] = 100 alpha[C] = 10 alpha[E] = 1이고,

EBDF에서 alpha[E] = 1000 alpha[B] = 100 alpha[D] = 10 alpha[F] = 1이다.

이제 같은 알파벳끼리 더한다.

alpha[A] = 100, alpha[C] = 10, alpha[E] = 1001(1 + 1000), alpha[B] = 100, alpha[D] = 10, alpha[F] = 1이다.

 

  • 이 값들을 내림차순 하여 9부터 0까지 매핑시키면 최댓값을 도출할 수 있다.

ACE + EBDF의 최댓값은

(9 * 1001 + 8 * 100 + 7 * 100 + 6 * 10 + 5 * 10 + 4 * 1 = 9009 + 800 + 700 + 60 + 50 + 4  = 10623)이다.

 

< 풀이 코드 >

# 1339번 단어 수학

n = int(input())

# 문자를 숫자로 바꾼 형태로 입력값 받기
word = [list(map(lambda x: ord(x)-65, input().strip())) for _ in range(n)]

# 알파벳 리스트 생성
alpha = [0] * 26

# 입력받은 문자열 순서대로 반복문 실행
for i in range(n):
  j = 0
  # 입력받은 문자열을 거꾸로 받아 10의 제곱수만큼 곱하고 alpha에 추가
  for w in word[i][::-1]:
    alpha[w] += (10 ** j)
    j += 1

# 알파벳 내림차순 정렬
alpha.sort(reverse=True)

# 정답값, 곱할 횟수 변수 생성
ans, t = 0, 9


for i in range(26):
  # 특정 인덱스 값이 0이 되면 그 다음부터 인덱스도 다 0이므로 반복문 탈출
  if alpha[i] == 0:
    break
  # 9부터 1씩 내려가며 정답값 도출  
  ans += t * alpha[i]
  t -= 1
  
 print(ans)

 

[백준 1339번 단어수학]

 

728x90
반응형
Comments