ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_단어수학_1339 (python)
    카테고리 없음 2023. 6. 2. 14:51

    ★ 접근법

    처음에 n의 최댓값은 10개이고 입력으로 주어지는 문자의 최대 길이는 8개, 구해야하는 답은 최댓값인 것을 봤을 때 모든 경우의 수를 유추하는 백트래킹, dp 마지막으로 백트래킹으로 풀 수 없을 것 같아서 그리디 알고리즘을 떠올렸다. 

     

    ★ 틀린 풀이법

     1. 각 문자가 등장하는 가장 큰 자릿수, 등장 횟수를 리스트로 만든다.

    2. 첫 번째 값에 대해서 오름차순으로 정렬하고 두 번째 인자에대해서는 첫 번째 인자가 같다면 오름차순으로 정렬하게 했다.

    3. 예제도 다 맞았고 게시판에 있는 딱 하나의 반례 빼고 모든 반례가 통과했다.

     

    ★ 딱 하나의 반례

    10

    ABB

    BC

    BC

    BC

    BC

    BC

    BC

    BC

    BC

    BC

     

    ★ 틀린 코드

    n = int(input())
    data = []
    dic = dict()
    for i in range(n):
        text = list(input())
        for i in range(len(text)):
            if text[i] not in dic:
                dic[text[i]] = [len(text) - i, 1]
            else:
                dic[text[i]] = [max(dic[text[i]][0], len(text) - i), dic[text[i]][1] + 1]
        data.append(text) #나중에 써먹을지도 모르니 일단 data에 담아둔다.
    
    answer = list(dic.items())
    answer = sorted(answer, key = lambda x : (-x[1][0], -x[1][1]))
    temp = dict()
    num = 9
    for i in answer:
        temp[i[0]] = str(num)
        num -= 1
    total = 0
    
    for i in data:
        tp = ""
        for j in range(len(i)):
            tp += temp[i[j]]
        total += int(tp)
    print(total)

     

    ★ 맞은 풀이법

    1. 각 문자가 등장할 때 그 자리의 가중치를 부여하는 것이다.

    2. 예를 들어 십의 자리에서 등장했다면 10증가, 백의 자리에서 등장했다면 100 증가

    3. 이게 끝이다 엄청 간단하다.

     

    ★ 맞은 코드

    n = int(input())
    dic = dict()
    for i in range(n):
        text = input()
        for i in range(len(text)):
            if text[i] not in dic:
                dic[text[i]] = 10 ** (len(text)-1 - i)
            else:
                dic[text[i]] += 10 ** (len(text)-1 - i)
    
    answer = list(dic.values())
    answer.sort(reverse=True)
    num = 9
    total = 0
    for i in answer:
        total += i * num
        num -= 1
    print(total)

     

    ★ 회고

     처음에 틀리고 반례를 마주쳤을 때 가중치 시스템을 떠올렸어야 됐는데 예제가 다 맞고 대부분의 반례가 맞은 상태에서는 IF문을 추가해서 문제를 풀려고 한다. 보통 이런 상황에서는 맞는 경우가 나오기 때문에 틀린 판단이라고 생각하지 않는다. 다만, IF문을 추가해도 풀 수 없고 다른 로직인 것 같다는 낌새를 느꼈을 때는 처음에 떠올린 생각에 매몰되지 말고 유연한 사고를 하는 것도 중요한 것 같다. 화이팅이다!!!!!!!!!!!!!!!!!!!!! 

     

     

Designed by Tistory.