관리 메뉴

πŸ’»πŸ’­πŸŽ§πŸŒ

BOJ 1339 : 단어 μˆ˜ν•™ (Python) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

BOJ 1339 : 단어 μˆ˜ν•™ (Python)

adorableco 2023. 2. 20. 23:17
λ°˜μ‘ν˜•

문제

https://www.acmicpc.net/problem/1339

 

1339번: 단어 μˆ˜ν•™

첫째 쀄에 λ‹¨μ–΄μ˜ 개수 N(1 ≤ N ≤ 10)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 단어가 ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀. λ‹¨μ–΄λŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ μ΄λ£¨μ–΄μ Έμžˆλ‹€. λͺ¨λ“  단어에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ•ŒνŒŒλ²³μ€ μ΅œλŒ€

www.acmicpc.net

 

 

μ½”λ“œ

import sys

n = int(sys.stdin.readline())

alpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
num = [0]*26 #μ•ŒνŒŒλ²³μ— 숫자λ₯Ό ν• λ‹Ήν–ˆλŠ”μ§€ μ—¬λΆ€
check = [0]*10 #숫자λ₯Ό μ‚¬μš©ν–ˆλŠ”μ§€ μ—¬λΆ€

array = [] #μ•ŒνŒŒλ²³ λ¬Έμžμ—΄μ„ λ‹΄μŒ
for i in range(n):
    array.append(list(sys.stdin.readline().strip('\n')))
    array[i].reverse()

array.sort(key=len,reverse = True)


for i in range(len(array[0])-1,-1,-1): #κ°€μž₯ κΈ΄ λ¬Έμžμ—΄μ˜ 길이-1 λΆ€ν„° μ‹œμž‘ν•΄μ„œ 0이 될 λ•ŒκΉŒμ§€ forλ¬Έ
    for j in range(n):
        if len(array[j]) > i: #λ¬Έμžμ—΄μ˜ 길이가 ν˜„μž¬ i 보닀 κΈΈλ‹€λ©΄
            if num[alpha.index(array[j][i])] == 0: #μ•ŒνŒŒλ²³μ— 아직 숫자λ₯Ό ν• λ‹Ήν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                for q in range(9,-1,-1): #숫자 μ‚¬μš© μ—¬λΆ€ 확인 (큰 μˆ«μžλΆ€ν„° μž‘μ€ 숫자둜)
                    if check[q] == 0: #ν•΄λ‹Ή 숫자λ₯Ό 아직 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                        check[q] = 1 #μ‚¬μš©ν–ˆλ‹€κ³  1둜 ν‘œμ‹œ ν›„
                        num[alpha.index(array[j][i])] = q #μ•ŒνŒŒλ²³μ— ν•΄λ‹Ή 숫자λ₯Ό ν• λ‹Ή
                        break
total = 0 

for i in range(n):
    array[i].reverse()
    temp = ""
    for j in range(len(array[i])):
        temp += str(num[alpha.index(array[i][j])]) #μ•ŒνŒŒλ²³μ„ 그에 ν•΄λ‹Ήν•˜λŠ” 숫자둜 λ³€ν™˜ 후에 temp에 λ„£μŒ
    total += int(temp(
print(total)

 

 

풀이

μžλ¦Ώμˆ˜κ°€ 큰 μ•ŒνŒŒλ²³μ— μš°μ„ μ μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자λ₯Ό λΆ€μ—¬ν•œλ‹€.

 

ex)

μ•„λž˜μ™€ 같이 λ‘κ°œμ˜ λ¬Έμžμ—΄μ΄ μžˆλ‹€κ³  κ°€μ •ν•œλ‹€. ( 두 λ¬Έμžμ—΄ λͺ¨λ‘ reverseκ°€ 된 μƒνƒœλΌκ³  κ°€μ •ν•œλ‹€.)

str1 = A B C D

str2 = B F G

κ°€μž₯ κΈ΄ λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” len(str1) = 4 μ΄λ―€λ‘œ 인덱슀 3 (len(str1)-1)μ—μ„œλΆ€ν„° 0으둜 순차적으둜 μ ‘κ·Όν•œλ‹€.

 

1.

str1[3] = D 에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 9λ₯Ό ν• λ‹Ήν•œλ‹€.

str2[3] λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ‹€μŒ 인덱슀둜 λ„˜μ–΄κ°„λ‹€.

check = [0, 0, 0, 0, 0, 0, 0, 0, 0,1]

2.

str1[2] = C 에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 8을 ν• λ‹Ήν•œλ‹€.

str2[2] = G 에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 7을 ν• λ‹Ήν•œλ‹€.

check = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]

3.

str1[1] = B에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 6을 ν• λ‹Ήν•œλ‹€.

str2[1] = F에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 5λ₯Ό ν• λ‹Ήν•œλ‹€.

check = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

4.

str1[0] = A에 μ‚¬μš©ν•˜μ§€ μ•Šμ€ κ°€μž₯ 큰 숫자인 4λ₯Ό ν• λ‹Ήν•œλ‹€.

str2[0] = Bμ—λŠ” 이미 6이 할당돼 μžˆμœΌλ―€λ‘œ 끝낸닀. (3λ²ˆμ—μ„œ 진행)

check = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]

 

μ •λ¦¬ν•˜λ©΄

D = 9, C = 8, G = 7, B = 6, F = 5, A = 4 이 λœλ‹€. 이 μˆ«μžλ“€μ„ μ•ŒνŒŒλ²³μ— λ„£μ–΄μ„œ μ •μˆ˜λ‘œ λ³€ν™˜ν•΄μ€€λ‹€.

λ¬Έμžμ—΄μ΄ reverse 된 μƒνƒœμ˜€μœΌλ―€λ‘œ λ‹€μ‹œ μ›λ³ΈμœΌλ‘œ λŒλ €μ„œ μ§„ν–‰ν•΄μ•Όν•œλ‹€.

 

str1 = DCBA = 9864

str2 = GFB = 756

 

μ΄λ―€λ‘œ λ”ν•˜λ©΄ 닡은 9864 + 756 = 10620 이닀. 

 

 

였λ₯˜.. λ°˜λ‘€....

10
ABB
BB
BB
BB
BB
BB
BB
BB
BB
BB

μœ„μ™€ 같이 μ£Όμ–΄μ‘Œμ„ λ•Œ B = 9 , A = 8 이 λ˜μ–΄μ•Ό 정상인데 Aκ°€ μžλ¦Ώμˆ˜κ°€ κ°€μž₯ ν¬λ‹€λ³΄λ‹ˆ A에 9κ°€ μš°μ„ μ μœΌλ‘œ λ“€μ–΄κ°€μ„œ μ˜€λ‹΅μ΄ λ‚˜μ˜¨λ‹€.

10의 μžλ¦¬μ— μœ„μΉ˜ν•œ Bκ°€ 10개 이상이면 λ”ν–ˆμ„ λ•Œ BλŠ” 100의 μžλ¦Ώμˆ˜κ°€ 되기 λ•Œλ¬Έμ— 이λ₯Ό κ³ λ €ν•΄μ•Όν•  ν•„μš”κ°€ μžˆλŠ”λ° 도톡 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Όν•  지 감이 μ•ˆμ˜¨λ‹€. 

 

 

μΆ”κ°€)

μ•ŒνŒŒλ²³ ν•˜λ‚˜ ν•˜λ‚˜μ”© λ¬Έμžμ—΄μ—μ„œ μœ„μΉ˜ν•˜λŠ” μžλ¦Ώμˆ˜μ— 1을 λ”ν•˜λŠ” μ‹μœΌλ‘œ 숫자둜 λ³€ν™˜μ„ ν•˜κ³  λ‚˜μ€‘μ— 큰 μˆ«μžλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ λΆ€μ—¬ν•˜λŠ” 방식을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

예λ₯Ό λ“€μ–΄ A κ°€ 만의 μžλ¦¬μ™€ μ‹­μ˜ μžλ¦¬μ— μœ„μΉ˜ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄ 수둜 λ³€ν™˜ν•˜λ©΄ 10010 κ°€ λœλ‹€. μœ„μΉ˜ν•˜λŠ” ν•΄λ‹Ήν•˜λŠ” μžλ¦Ώμˆ˜μ— 1μ”© λ”ν•΄μ£ΌλŠ” 것이닀.

μ΄λ ‡κ²Œ ν•˜λ©΄ μ•ŒνŒŒλ²³μ΄ μ—¬λŸ¬ 개인 κ²½μš°μ—λ„ κΈ°μ—¬ν•˜λŠ” 정도가 μ–΄λŠ 정도인지 νŒλ‹¨ν•  수 있고 이 기여도에 λ”°λΌμ„œ 큰 숫자λ₯Ό λΆ€μ—¬ν•˜λ©΄ λ˜λŠ” 것이닀.

 

λ°˜μ‘ν˜•