목차
1. 문제

2. 입출력 예시
| 입력 예시 | 출력 예시 |
|---|---|
| 2 AAA AAA | 1998 |
| 2 GCF ACDEB | 99437 |
| 10 A B C D E F G H I J | 45 |
| 2 AB BA | 187 |
3. 문제 풀이
이 문제는 딕셔너리를 활용하면 어렵지 않게 해결할 수 있다. 각 단어의 알파벳을 key로 설정 후 알파벳의 위치를 10의 제곱으로 나타내기로 하였다. 이를 표로 나타내면 아래와 같다.
| 단어 | 내용 |
|---|---|
| GCD | G(100), C(10) + D(1) |
| ACEBF | A(10000) + C(1000) + E(100) + B(10) + F(1) |
위 표에 나타난 단어의 알파벳을 중복제거 후 값이 큰 순으로 정렬하면 아래와 같다. 이 알파벳 정렬 순으로 반복을 수행하며 알파벳에 해당하는 값에 9 - 인덱스 값의 총 합이 이 문제의 답이 된다.
| 알파벳 | 값 |
|---|---|
| A | 10000 * 9 |
| C | 1010 * 8 |
| E | 100 * 7 |
| G | 100 * 6 |
| B | 10 * 5 |
| D | 1 * 4 |
| F | 1 * 3 |
문제를 해결하기 위해 먼저 아래와 같이 처리 순서를 세워보았다.
- 입력할 단어의 수량(
N)을 입력받고, 단어를 저장할 리스트(words)를 생성한다. - 입력할 단어의 수량만큼 반복하며 단어를 입력받아 리스트에 추가한다.
- 알파벳 정보를 저장할 딕셔너리(
index)를 생성 후 반복문을 통해 리스트에 저장된 단어를 호출한다. 단어의 인덱스가 클 수록 10의 제곱 단위가 커지며 이를 10의 제곱으로 나타내기 위하여 단어의 길이를 변수(length)에 저장 후 아래의 내용을 수행한다.- 이중반복문을 사용하여 단어의 알파벳 만큼 반복한다. 만약 딕셔너리의
key에 해당 알파벳이 포함되어 있을 경우에는 해당key의value에 10의length제곱을 더하며(위의 표에서 C의 경우(1010)가 이에 해당한다.), 그렇지 않을 경우에는 딕셔너리에key와value를 해당 알파벳과 10의length제곱으로 초기화한다. - 이중반복문의 반복이 진행될 때마다 단어에 해당하는 알파벳의 자릿수가 뒤로 밀려나므로
length에 1을 뺀다.
- 이중반복문을 사용하여 단어의 알파벳 만큼 반복한다. 만약 딕셔너리의
- 반복이 종료된 후에는 딕셔너리의
value를 리스트(numbers)로 저장하고, 이를 내림차순으로 정렬한다. - 결과값(
total)을 0으로, 적용할 숫자(cnt)를 9로 초기화한 후 정렬한 리스트(numbers) 만큼 반복을 수행한다. 반복을 수행하는 동안 결과값에해당 알파벳의 값 × 적용할 숫자를 더하고, 적용할 숫자에 1을 뺀다. - 반복이 종료되면 결과값을 출력한다.
이를 코드로 나타내면 아래와 같으며, 메모리는28,776 KB, 시간은 68 ms가 소요되었다.
import sys
N = int(sys.stdin.readline())
words = []
for _ in range(N):
words.append(sys.stdin.readline().replace("\n", ""))
index = {}
for word in words:
length = len(word) - 1
for c in word:
if c in index:
index[c] += 10 ** length
else:
index[c] = 10 ** length
length -= 1
numbers = sorted(index.values(), key=lambda x: -x)
total = 0
cnt = 9
for number in numbers:
total += (number * cnt)
cnt -= 1
print(total)'Algorithm > Baekjoon' 카테고리의 다른 글
| Baekjoon #1715 - 카드 정렬하기 (0) | 2021.03.25 |
|---|---|
| Baekjoon #4796 - 캠핑 (0) | 2021.03.25 |
| Baekjoon #10162 - 전자레인지 (0) | 2021.03.24 |
| Baekjoon #1946번 - 신입 사원 (0) | 2021.03.23 |
| Baekjoon - #2217 - 로프 (0) | 2021.03.23 |