[ BOJ / Python ] 1132번 합

황승환·2022년 2월 12일
0

Python

목록 보기
179/498


이번 문제는 시간이 정말 오래 걸렸다. 전에 풀어보았던 문제와 비슷하여 딕셔너리를 이용하여 해당 key에 대한 value에 자릿수를 더하고 자릿수 내림차순으로 정렬하여 9부터 1씩 감소시키며 곱한 값을 더하는 방식으로 접근하였다. 그러나 이 문제에서는 첫자리 숫자가 0인 것을 허용하지 않는다는 제한 사항이 있었다. 이를 해결하기 위해 여러가지 방법으로 접근해보았다.

도출된 방법은 첫자리 문자에 대한 체킹을 따로 해주고, J가 첫자리로 들어간 문자열이 하나라도 존재할 때, 자릿수를 보관한 리스트를 역순으로 순회하며 첫자리 수로 사용된 적이 없는 문자가 나오면 그 문자를 리스트에서 삭제해준다. 그리고 9부터 1씩 감소시키며 자릿수와 곱하여 정답 변수에 더해주었다.

이 방법을 생각했을 때 딕셔너리를 다루는 능력이 부족하여 구현에 어려움을 겪었고, 결국은 ord()함수를 이용하여 2차원 리스트를 사용하였다. 이 리스트의 인덱스는 ord()-65로 하여 0부터 A, B, ... , J에 해당하도록 매칭했다. 리스트로 처리하니 한결 구현하기 쉬워졌고 오랜 시간에 걸쳐서 해결할 수 있었다.

  • n을 입력받는다.
  • 각 문자의 자릿수와 첫번째의 여부를 저장하기 위한 리스트 match를 2차원 리스트로 선언한다.
  • 정답을 저장할 변수 answer를 0으로 선언한다.
  • n번 반복하는 for문을 돌린다.
    -> word를 입력받는다.
    -> 자릿수 역할을 할 변수 m을 1로 선언한다.
    -> match[ord(word[0])-65][0]에 m을 더한다.
    -> m을 10 곱한다.
  • match를 내림차순으로 정렬한다.
  • 만약 match[9][1]이 True일 경우, 즉 J가 가장 앞에 쓰인 문자열이 있는 경우
    -> 8부터 0까지 반복하는 i에 대한 감소하는 for문을 돌린다.
    --> 만약 match[i][1]이 False일 경우, 즉 해당 문자가 가장 앞에 쓰인 문자열이 없는 경우
    ---> match[i]를 지운다.
    ---> 반복문을 종료한다.
  • 9번 반복하는 i에 대한 for문을 돌린다.
    -> answer에 match[i][0]*(9-i)를 더한다.
  • answer를 출력한다.

Code

n = int(input())
match = [[0, False] for _ in range(10)]  # A B C ..
answer = 0
for _ in range(n):
    word = str(input())
    m = 1
    match[ord(word[0])-65][1] = True
    for c in range(len(word)-1, -1, -1):
        match[ord(word[c])-65][0] += m
        m *= 10
match.sort(reverse=True)
if match[9][1]:
    for i in range(8, -1, -1):
        if not match[i][1]:
            del match[i]
            break
for i in range(9):
    answer += match[i][0] * (9-i)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글