ebson

boj.kr/1339 단어 수학 (gold4) 파이썬 풀이 본문

ALGORITHM STUDY WITH PYTHON/Greedy

boj.kr/1339 단어 수학 (gold4) 파이썬 풀이

ebson 2023. 5. 9. 17:54

오답풀이

- 제시된 4개 테스트 케이스는 통과했으나 제출시 틀린 케이스가 있었다.

N = int(input())
words = [input() for _ in range(N)]
words = sorted(words, key=lambda x: len(str(x)), reverse=True)
matches = [0 for _ in range(10)]
pointers = []

import heapq

for i in range(len(words)):
    heapq.heappush(pointers, (-len(words[i]), i, -len(words[i])))

mIdx = 9
while mIdx >= 0:
    (pointer, wIdx, len) = heapq.heappop(pointers)
    (pointer, wIdx, len) = (-pointer, wIdx, -len)
    if words[wIdx][len-pointer] in matches:
        pointer -= 1
        heapq.heappush(pointers, (-pointer, wIdx, -len))
    else:
        matches[mIdx] = words[wIdx][len-pointer]
        pointer -= 1
        heapq.heappush(pointers, (-pointer, wIdx, -len))
        mIdx = mIdx - 1

    tot = 0
    for item in pointers:
        tot += item[0]
    if tot == 0:
        break

numbers = [0]
for word in words:
    for c in word:
        word = word.replace(str(c), str(matches.index(c)))
    numbers.append(int(word))

print(sum(numbers))

 

정답풀이 

- 단어의 각 문자를 숫자로 바꾸는 경우 자릿수가 가장 큰 것에 우선적으로 큰 수를 부여한다. 

- 그 문자가 정확히 무엇이엇는지 기억하는 것이 아니라 총합이 최댓값이 되도록 하는 것이 목표이다. (각 문자는 인덱스로 구분만 되면 되고, 각 문자의 자릿수를 정확히 알고 계산해야 한다.)

- enumerate를 사용해 리스트를 순회하면 인덱스와 값을 동시에 얻을 수 있다. (마지막 인덱스부터 순회하면 각 문자의 자리수를 얻을 수 있다.)

- 가장 큰 자리수로 저장된 문자부터 큰 수를 부여해 총합을 계산한다.

 

1. 각 문자열을 각 문자별로 0-25의 정수로 치환

2. 알파벳 배열을 26개의 0으로 초기화

3. 각 문자열을 뒤집어 enumerate 으로 인덱스와 문자를 정수로 변환한 값(i, c)을 조회하고 순회시마다 아래를 반복

3.1. 알파벳 배열[c] 값에 i**10을 더하기

4. 알파벳 배열을 내림차순으로 정렬

5. 알파벳 배열의 0번 요소부터 8번 요소까지 9부터 1까지 정수를 큰수부터 차례대로 각각 곱한 값을 누적

6. 누적합을 출력

 

N = int(input())
words = []
for _ in range(N):
    words.append(list(map(lambda c: ord(c)-65, input())))

alphabets = [0] * 26
for word in words:
    for i, c in enumerate(word[::-1]):
        alphabets[c] += 10 ** i
alphabets.sort(reverse=True)

n = 9
tot = 0
for i in range(9):
    tot += n*alphabets[i]
    n -= 1

print(tot)

 

ord(문자) 함수를 사용하면 해당하는 아스키코드 정수값을 얻을 수 있다.

문자열을 [::-1] 의 인덱스로 조회하면 뒤집힌 문자열의 결과를 얻을 수 있다.

Comments