ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_16678_모독 (python)
    카테고리 없음 2023. 7. 13. 13:15

    ★ 접근

    국회의원의 수가 최대 십만 명 + 각 국회의원 당 주어지는 명예 최대 십만 + 해커가 국회의원 한 명의 명예를 떨어트리는 점수 겨우 1점 = > 그리디 알고리즘 

     

    ★ 풀이

    (국회의원 명예 점수는 1부터 시작해서 1씩 늘어나게 존재해야 한다. 이유는 "Defile"를 계속 하기 위함이다)

    1. .일단 먼저 명예 점수를 오름차순으로 정렬한다.

    2. 1부터 시작해서 현재 국회의원과 점수가 다르다면

      2-1. 근데 현재 국회의원 점수가 크거나 같다면 차이를 빼서 더하면 된다. + 그리도 다음 num으로 넘어간다.

      2-2. 작다면 그냥 무시하고 다음 단계로 넘어간다. 이유는 현재 data[idx]가 3이고 num이 4라했을 명예를 늘릴 방법이 없고 늘릴 이유도 없다. 문제는 명예 점수를 줄이는 것이 목표다.

     

    ★ 코드

    import sys
    input = sys.stdin.readline
    n = int(input())
    data = []
    for _ in range(n):
        honor = int(input())
        data.append(honor)
    answer = []
    num = 1
    idx = 0
    result = 0
    data.sort()
    while idx < len(data):
        if num != data[idx]:
            if data[idx] >= num:
                result += data[idx] - num
                num += 1
            else:
                pass
        else:
            num += 1
        idx += 1
    print(result)

    ★ 회고

     처음에는 결국 명예 점수를 1~n 까지 맞추면 된다고 생각했기에 엄청 간단하게 문제 풀이를 했다. 하지만 n 보다 작은 수로만 이루어질 수도 있는 반례가 있었다.

    그리디라고 생각하고 로직을 떠올렸을 때 반례까 있을지 없을지 한번 더 생각해보고 코드를 짜보자

Designed by Tistory.