*포스팅 스타일 변경
친구 : 문제 푼 사람들 다들 천재인가봐 어떻게 저런 접근법을 바로 생각하지?? 난 못하겠던데.. 너무 어려워ㅠㅠ
음.. 친구에게 도움이 될지는 모르겠지만 한 문제를 풀때도 여러 시행착오를 겪은 뒤에 푸는 사람이 있다는 것을 알려주고 싶었습니다.
따라서 문제를 풀때 했던 생각들을 모조리 적어볼까 합니다.
의식의 흐름을 적는거니까 난잡해질 가능성이 있습니다.
문제 링크
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
문제 설명
'N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램을 작성하시오.'
알파벳이랑 0~9까지의 수를 매칭하여 푸는 문제입니다.
접근 방법
-
특정 알파벳이 여러 번 등장한다면 그 우선순위를 적용하고 싶습니다.
-
그러나 1의 자리에서 5번 등장한 알파벳보다 10의 자리에서 1번 등장한 알파벳의 가중치가 높아야합니다.
-
이를 해결할 방법이 떠오르지 않아서 보류했습니다.
-
-
1-1를 보면 최대한 큰 자리에 위치한 알파벳에게 가중치를 높게 부여해야함을 알 수 있습니다.
-
각 알파벳마다 가중치 부여 -> dictionary를 떠올렸습니다.
-
ABCD가 있다면 A : 4,B : 3,...을 부여했습니다. 숫자가 클 수록 후에 높은 값을 할당받습니다.
-
ABCD + CFG라고 하면 후자의 C에 의해 더 큰 값으로 갱신합니다.
-
-
내림차순으로 정렬을 하고 (그러면 높은 값이 먼저 위치) 9부터 각 알파벳에 숫자를 차례대로 할당해줍니다.
-
다음에는 할당한 숫자와 함께 수식 계산을 해주면 됩니다.
-
작성한 소스코드는 이러합니다.
import sys
input = sys.stdin.readline
n = int(input())
a = [input().rstrip() for i in range(n)]
dic = {}
for i in range(n):
for j in range(len(a[i])):
if a[i][j] in dic:
if dic[a[i][j]] < len(a[i]) - j:
dic[a[i][j]] = len(a[i]) - j
else:
dic[a[i][j]] = len(a[i]) - j
dic = sorted(dic.items(),key = lambda x:x[1],reverse=True)
pri = 9
tmp = {}
for i in range(len(dic)):
temp = list(dic[i])
temp[1] = pri-i
tmp[temp[0]] = temp[1]
sum = 0
for i in range(n):
for j in range(len(a[i])):
sum += tmp[a[i][j]]*(10**(len(a[i])-j-1))
print(sum)
사실 이렇게 풀면 틀렸습니다가 나옵니다.
1의 조건을 제대로 만족하지 못했기 때문입니다.
코드를 보면 아시겠지만 2-4를 표현하면서 1번 조건을 해결할 방법을 사용했습니다.
처음 방법 떠올릴때는 분명 몰랐는데 어찌된 영문인지 모르겠습니다.
소스 코드
import sys
input = sys.stdin.readline
n = int(input())
a = [input().rstrip() for i in range(n)]
dic = {}
for i in range(n):
for j in range(len(a[i])):
if a[i][j] in dic:
dic[a[i][j]] += (10**(len(a[i])-j-1))
else:
dic[a[i][j]] = (10**(len(a[i])-j-1))
dic = sorted(dic.items(),key = lambda x:x[1],reverse=True)
priority = 9
sum = 0
index = 0
for key,value in dic:
sum += (priority-index)*value
index+=1
print(sum)
이쪽이 정답인 소스입니다.
이 경우에는 ABCD면 A:1000 B:100,....으로 할당이 됩니다.
예시를 하나 추가하여 ABAC는 A:1010 B:100,...이 됩니다.
여기도 가중치가 큰 값에 높은 숫자(9)를 주기 위해서 내림차순 정렬을 해줍니다.
sum 계산할때는 그저 1010*9를 해주면 되겠죠!!
저는 처음에 딕셔너리를 떠올렸기에 그를 이용했습니다만
다른 알파벳 다루는 문제들처럼 int alpha[26] = [0]*26을 이용해서 접근하셔도 됩니다!!
'알고리즘 > ps' 카테고리의 다른 글
[파이썬] 백준 20115 에너지 드링크 (1) | 2021.03.06 |
---|---|
[python] 백준 10799 쇠막대기 (0) | 2021.02.04 |
[python] 백준 1946 신입사원 (0) | 2021.01.04 |
[python] 백준 9020 골드바흐의 추측 (0) | 2020.08.02 |
백준 10610 python 문제 풀이 (0) | 2020.07.29 |