새소식

알고리즘 테스트 ⏲/백준

[백준] 1339. 단어 수학 풀이 (Python, JavaScript)

  • -
 

1339번: 단어 수학

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

www.acmicpc.net

접근한 방법

각 단어들의 자릿수들을 계산해줍니다. 예를 들어 예제 2의 GCF에서 G = 100, C = 10, F = 1 이 되고 ACDEB에서 A = 10000, C는 한번 나왔으므로 기존 값에 더해서 10 + 1000, D는 100, E는 10, B는 1이됩니다. 모든 알파벳에 대한 26개의 공간을 만들어두고 앞서 이 값들을 배열로 표현하면 아래와 같이 됩니다.

[ 10000, 1, 1010, 100, 10, 1, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

앞에서부터 A, B, C ... 순입니다. 큰 값부터 9~1의 수를 부여해줘야 하므로 내림차순 정렬 후 9~1을 순차적으로 곱해줍니다.

[ 90000, 8080, 700, 600, 50, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

0이 아닌 값에 대해서 이 값들을 모두 더해주면 단어의 합의 최댓값을 구할 수 있습니다.

 

Python

import sys
input = sys.stdin.readline

n = int(input())
cands, num = [0] * 26, 9
for _ in range(n):
    cand = list(input().rstrip())
    for i in range(len(cand)):
        cands[ord(cand[i]) - 65] += 10 ** (len(cand) - i - 1)
cands.sort(reverse=True)
for i in range(10):
    if not cands[i]:
        break
    cands[i] *= num
    num -= 1
print(sum(cands))

JavaScript

function solution(n, str) {
  const cands = Array(26).fill(0);
  let num = 9;
  str.forEach((cand) => {
    for (let i = 0; i < cand.length; i += 1) {
      cands[cand[i].charCodeAt() - 65] += 10 ** (cand.length - i - 1);
    }
  });
  cands.sort((a, b) => b - a);
  for (let i = 0; i < 10; i += 1) {
    if (!cands[i]) break;
    cands[i] *= num--;
  }
  return cands.reduce((accr, curr) => accr + curr, 0);
}
solution(2, ["GCF", "ACDEB"]);
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.