Algorithm/Greedy

[이코테] 만들 수 없는 금액

킹우현 2023. 2. 2. 21:49

1. 본인 풀이

n = int(input())
data = list(map(int,input().split()))

data.sort(reverse=True) # 동전의 금액을 내림차순으로 정렬

result = 1 # 결과(답)은 1부터 시작

while result <= sum(data): # 끝까지 답이 나오지 않으면 정답(최소값)은 '동전의 금액 총합 + 1'

    number = result

    for i in range(len(data)): # 동전의 금액 별로 반복

        if data[i] <= number: # 동전의 금액이 현재 값보다 작거나 같은 경우
            number -= data[i] # 일단 현재 값에서 동전의 금액만큼 뺀다

    if number == 0: # 동전의 금액 별로 전부 빼봤을 때 현재 값이 0 인 경우(만들 수 있는 금액인 경우)
        result += 1 # 다음 수로 넘어간다

    else: # 동전의 금액 별로 전부 빼봐도 현재 값이 0이 아닌 경우(만들 수 없는 금액인 경우)
        break # 그 값이 곧 정답

print(result)

2. 교재 답안

n = int(input())
data = list(map(int,input().split()))

data.sort()

target = 1
for i in data:
    # 만들 수 없는 금액을 찾았을 경우 반복문 종료
    if target < i:
        break
    target += i

# 만들 수 없는 최소 금액 출력
print(target)

 

이 문제는 2번을 풀어봤지만 두 번 모두 1부터 시작하여 내부의 동전들로 만들 수 있는지 일일이 찾아가며 풀었다.

이렇게 풀이할 경우에는 1부터 가장 큰 값까지 찾아보는 반복문 한 개, 그 값을 가지고 동전 배열 내에 있는 값들을 모두 연산하는 반복문 한개로 2중 반복문을 사용하는 아주 비효율적으로 문제를 풀이하게 된다.

 

따라서 이 문제는 먼저 동전들을 오름차순으로 정렬한 뒤에 "target(다음 테스트 값)"을 설정하여 이 target 값이 해당 index의 동전보다 크거나 같은 경우에만 target 값을 업데이트 시켜가는 방식으로 쉽게 풀이 할 수 있다.

 

target-1 까지는 만들 수 있는 금액이라는 것이 증명되었기 때문에 다음 값으로 업데이트 시켜주고, 만약 이 target 값이 해당 index의 동전보다 작은 경우에는 그 금액을 만들 수 없다.

 

 

'Algorithm > Greedy' 카테고리의 다른 글

[백준 11399번] ATM  (0) 2023.02.06
[백준 2839번] 설탕 배달  (0) 2023.02.06
[이코테] 무지의 먹방 라이브  (0) 2023.02.05
[이코테] 볼링공 고르기  (0) 2023.02.02
[이코테] 큰 수의 법칙  (0) 2023.01.29