일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 색종이와가위
- 비밀 코드 해독
- string construction
- two characters
- dp
- pccp 기출문제 풀이
- 프로그래밍공부
- lock based stack
- pcce 기출문제 풀이
- ice cream parlor
- LCS
- boj 20207
- count triplets
- 2025 프로그래머스 코딩챌린지 1차예선
- DirectX
- 홀짝트리
- special string again
- DirectX12
- lock based queue
- PCCE
- 브루트포스
- boj 1074
- c++
- boj 6443
- lock free stack
- 지게차와 크레인
- boj 11657
- boj 21921
- boj 1717
- making anagrams
- Today
- Total
오구의코딩모험
[Python] 1339번 : 단어 수학 본문
문제 3줄 요약
1. 알파벳 대문자로 이루어진 문자열들을 더한다.
2. 각 알파벳은 0부터 9 사이의 숫자 중 하나로 대체한다.
3. 문자열 합의 최댓값은?
처음엔 떠오른 방법은
1. 수의 단위가 높은 곳에 있는 알파벳
2. 수의 단위가 같고 빈도수도 같다면, 그 다음으로 높은 단위에 있는 알파벳
이 두 가지 규칙을 적용하여 코드를 작성하고 제출하였다.
Ex) GCF + ACDEB = 만의 자리(A : 1), 천의 자리(C:1), 백의 자리(G:1, D:1), 십의 자리(C:1, E:1), 일의 자리(F:1, B:1)
→ 방향 순으로 9부터 차례대로 부여
제출하니..
런타임 에러는
-1까지 값이 내려가서 생긴 오류이고,
위의 규칙을 적용한 코드는 틀렸다고 나온다..
반례를 찾다보니,
10, ABB, BB, BB, BB, BB, BB, BB, BB, BB, BB
를 보고 아차 싶었다.
무조건 자리 수가 높다고 큰 값을 부여한다면,
남은 자리의 합이 더 높은 경우를 놓치는 것이었다.
따라서
수의 크기별로 카운트 해준 값을
연산해서 비교해주기로 하였다.
Ex) GCF + ACDEB = 만의 자리(A : 1), 천의 자리(C:1), 백의 자리(G:1, D:1), 십의 자리(C:1, E:1), 일의 자리(F:1, B:1)
A = 10000, C = 1000, G = 100, D = 100, C = 10, E = 10, F = 1, B = 1
→ 방향 순으로 9부터 차례대로 부여
이런 방식이라면,
위와 같은 반례를 통과하고 코드 또한 간단해져 속도가 매우 빠르게 통과한다!
from sys import stdin
from collections import defaultdict
if __name__ == "__main__":
N = int(stdin.readline())
alphabet_dict = defaultdict(int)
result_dict = defaultdict(int)
# 수의 자리에 따른 알파벳 카운트
str_list = []
for _ in range(N):
str_list.append(str(stdin.readline().strip())[::-1])
count_list = []
for idx in range(8):
count_list.append(defaultdict(int))
for s in str_list:
if len(s) > idx:
count_list[idx][s[idx]] += 1
# 각 알파벳이 가지고 있는 숫자의 합
for idx in range(7,-1,-1):
if len(count_list[idx]):
for key in count_list[idx].keys():
alphabet_dict[key] += count_list[idx][key]*(10**idx if idx!= 0 else 1)
# 내림차순으로 정렬하고 문자열에 대체
number = 9
for key in dict(sorted(alphabet_dict.items(), key=lambda item:item[1], reverse=True)).keys():
result_dict[key] = number
number -= 1
for i, string in enumerate(str_list):
string = list(string)
for idx,s in enumerate(string[::-1]):
string[idx] = str(result_dict[s])
str_list[i] = int(''.join(string))
print(sum(str_list))
끝

'프로그래밍 공부 > 백준 알고리즘' 카테고리의 다른 글
[Python] 1644번 : 소수의 연속합 (0) | 2023.02.22 |
---|---|
[Python] 2470번 : 두 용액 (0) | 2023.02.21 |
[Python] 1715번 : 카드 정렬하기 (0) | 2023.02.18 |
[Python] 9935번 : 문자열 폭발 (0) | 2023.02.17 |
[Python] 9251번 : LCS (0) | 2023.02.17 |