Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

16-suhyun113 #49

Merged
merged 1 commit into from
Sep 25, 2024
Merged

16-suhyun113 #49

merged 1 commit into from
Sep 25, 2024

Conversation

suhyun113
Copy link
Collaborator

@suhyun113 suhyun113 commented Sep 13, 2024

🔗 문제 링크

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

✔️ 소요된 시간

약 40분

✨ 수도 코드

🪙1. 문제 설명🪙
동전의 종류와 목표 금액이 주어졌을 때, 최소한의 동전 개수로 목표 금액을 만드는 방법 찾기

🪙2. 문제 풀이 방법🪙
1) 입력 처리

  • 동전의 종류 수 n과 목표 금액 k를 입력받는다.
  • 각 동전의 가치를 리스트 coins에 저장한다.

2) 정렬

  • 동전의 가치는 큰 것부터 작은 것 순으로 사용해야 하므로, 입력받은 동전 리스트를 내림차순으로 정렬합니다. (코드에서는 reversed를 사용하여 큰 동전부터 탐색한다.)

3) 그리디 선택

  • 가장 큰 동전부터 시작하여, 현재 동전으로 만들 수 있는 최대 개수를 계산합니다.
  • k // coin을 통해 현재 동전으로 만들 수 있는 개수를 구하고, 이를 count에 추가합니다.
  • k %= coin을 통해 남은 금액을 업데이트합니다. 이 과정은 목표 금액이 0이 될 때까지 반복됩니다.

4) 종료 조건

  • 목표 금액 k가 0이 되면 더 이상 동전을 사용할 필요가 없으므로 반복을 종료한다.

5) 결과 출력

  • 최종적으로 사용한 동전의 개수 count를 출력한다.

🪙3. 알고리즘🪙

그리디 알고리즘
매 단계에서 가장 최적이라고 생각되는 선택을 하는 방식
매 단계에서 가장 큰 동전을 선택하여 목표 금액을 줄여나가는 방식이다. 이 알고리즘은 동전의 가치가 서로 배수 관계에 있을 때 최적의 해를 보장한다. 이 문제에서 동전의 가치가 서로 다르기 때문에, 큰 동전부터 사용하는 것이 최적의 해를 제공한다.

🪙4. 최종 코드🪙

# 11047 : 동전 0

# 동전의 종류와 목표 금액을 입력받아 최소 동전 개수를 계산하는 함수
def min_coins(n, k, coins):
    count = 0  # 동전 개수를 세기 위한 변수
    for coin in reversed(coins):  # 동전의 종류를 큰 것부터 작은 것 순으로 탐색
        if k == 0:  # 목표 금액이 0이면 더 이상 동전을 사용할 필요 없음
            break
        count += k // coin  # 현재 동전으로 만들 수 있는 최대 개수 추가
        k %= coin  # 남은 금액 업데이트
    return count  # 최소 동전 개수 반환

# 입력 받기
n, k = map(int, input().split())  # 동전의 종류(n)와 목표 금액(k) 입력
coins = [int(input()) for _ in range(n)]  # 동전의 종류 입력

# 최소 동전 개수 계산 및 출력
result = min_coins(n, k, coins)
print(result)

📚 새롭게 알게된 내용

그리디 알고리즘이 매 단계에서 최적의 선택을 하는 것은 알고 있었지만, 동전 문제에서 큰 동전부터 사용하는 것이 최적이라는 점을 이해하기 좀 힘들었던 것 같다. 또한 이 문제가 "동전의 가치가 서로 배수 관계일 경우" 였기 때문에 그리디 알고리즘이 최적의 해를 보장하는 것이라는 것을 알게되었다.
그리디 알고리즘이 문제에 어떻게 적용되는지 알게되었으며, 그리디 알고리즘이 일반적으로 시간복잡도가 낮아 빠르게 처리할 수 있다는 것을 알게되었다.

추가적으로, 동전의 가치가 서로 배수 관계가 아닐 경우, 그리디 알고리즘이 아닌 '동적 프로그래밍'을 사용해야 한다는 것을 알게되었다.

Copy link
Member

@oesnuj oesnuj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리디 알고리즘 하면 동전 문제가 대표적인 예시로 많이 다뤄지죠! 저도 수현님과 동일한 로직으로 풀었던 문제네요.
배수관계에 따라 접근법을 나누어 생각해볼 수 있어서 좋았습니다!
PR 잘 읽었습니다! 즐거운 추석연휴 되세요😊

Copy link
Collaborator

@pu2rile pu2rile left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제 선택하면서 항상 봐왔던 문제인데 결국 이렇게 풀게 되네요 ㅎㅎ
풀고 나서 수현님 코드와 제 코드를 비교해 보니 수현님은 함수를 사용해서 재사용성과 가독성을 높이if k == 0 조건문을 사용해서 남은 금액이 0이면 더 이상 계산하지 않게 했다는 것이 큰 차이점인 것 같아요.

여러모로 저보다 더 예쁘게 작성하신 것 같아서 배우고 갑니다... pr 수고하셨어요!

N, K = map(int, input().split()) 
coins = list()
for i in range(N):
    coins.append(int(input()))

count = 0
for i in reversed(range(N)):
    count += K // coins[i]
    K = K % coins[i]

print(count)

@suhyun113 suhyun113 merged commit a638f5d into main Sep 25, 2024
1 check passed
@suhyun113 suhyun113 deleted the 16-suhyun113 branch September 25, 2024 18:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants