이동준1
아웃풋 공부
이동준1
전체 방문자
오늘
어제
  • 분류 전체보기 (89)
    • 짧은서평 (29)
    • airflow (8)
    • sql (23)
    • aws (12)
    • python (3)
    • 네트워크 (12)
    • 알고리즘 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 워런 버핏 웨이
  • Network
  • regexp
  • AWS
  • 고통의 비밀
  • 마음의기술 서평
  • 네트워크
  • 고통의비밀
  • 퓨처셀프
  • 서평
  • 마음의기술
  • 통증해방 서평
  • 통증해방
  • 유연함의힘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이동준1
알고리즘

[알고리즘] 만들 수 없는 금액

알고리즘

[알고리즘] 만들 수 없는 금액

2023. 1. 10. 10:14

문제  (이코테 P. 314)

동네 편의점의 주인인 동빈이는 N개의 동전을 가지고 있습니다. 이때 N개의 동전을 이용하여 만들 수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램을 작성하세요.

예를 들어, N=5 이고, 각 동전이 각각 3원, 2원, 1원, 1원, 9원짜리(화폐 단위) 동전이라고 가정합시다. 이때 동빈이가 만들 수 없는 양의 정수 금액 중 최솟값은 8원입니다.

또 다른 예시로, N=3이고, 각 동전이 각각 3원, 5원, 7원 동전이라고 가정합시다. 이때 동빈이가 만들 수 없는 양의 정수 금액 중 최솟값은 1원입니다.

 

입력

첫째 줄에는 동전의 개수를 나타내는 양의 정수 N이 주어진다. (1 <= N <= 1,000)

둘째 줄에는 각 동전의 화폐 단위를 나타내는 N개의 자연수가 주어지며 각 자연수는 공백으로 구분된다. 각 화폐 단위는 1,000,000 이하의 자연수이다.

 

출력

첫째 줄에 주어진 동전들로 만들 수 없는 양의 정수 금액 중 최솟값을 출력한다.

 


풀이

전형적인 그리디 문제이다. 주어진 금액을 오름차순으로 정렬한 뒤에, 화폐 단위가 작은 동전부터 하나씩 확인하면서 target 을 업데이터 하는 방법으로 최적의 해를 구할 수 있다.

 

나는 possessed 변수와 target 변수를 이용해서 문제를 풀이했는데, possessed 변수는 '~까지 생성가능한 금액'을 나타낸다. 예를들어 possessed = 5이라면, 5까지의 금액을 생성할 수 있으며 주어진 돈으로 1원, 2원, 3원, 4원, 그리고 5원을 만들수 있다는 말이다.

 

그리고 target변수는 만들수있을지 확인해야하는 금액이다. possessed가 5라면 target은 6이된다. 문제에서 주어진 동전들로 만들 수 없는 양의 정수 금액 중 최솟값을 원했다. 그래서 5까지의 금액이 생성된다면 다음으로 금액 6도 생성되는지 확인해야된다.

 

금액을 1부터 시작해서 차례로 증가시키며 금액을 확인해야하는데, 정렬된 리스트 맨앞에 1이 없다면 1원은 만들 수 없으므로, 그 경우 1을 반환하도록 했다. 그 다음으로 반복문을 사용하면서 target값을 갱신시키며 확인하는 과정을 거쳤는데, 새로 확인하는 값이 target값보다크다면 target은 절대 만들 수 없다. 그때 target을 반환해주면 된다.

 

예를들어, 만들수 있는 금액(possessed)이 5원까지이면 target은 6이다. 직후에 새로 들어온 금액이 5라면, 1원부터 10원까지 생성하는 것이 가능하다 (새로 들어온값 5 + 생성할수 있는값 5). 이때는 target이 11로 갱신된다. 그리고 새로들어온 금액이 6이라면, 1원부터 11원까지 생성하는 것이 가능하다 (새로 들어온값 6 + 생성할수 있는값 5). 이때는 target이 12로 갱신된다. 그러나, 새로 들어온 값이 7이라면 6원을 생성하는것이 불가능하다. '새로 들어온값 + 생성할 수 있는값' 으로 6원을 만들지 못하기 때문이다. 따라서, 새로 확인하는 값이 target 값보다 크다면 target값을 만들 수 없다. 이때 target값을 반환해주면 된다.

 

target값을 만들 수 있다면, 소유할수있는 금액(possesed)을 업데이트해주고 다시 위 과정을 반복한다.

 

#1) n개의 동전
#2) n개의 동전을 이용하여 만들 수 없는 양의 정수 금액 중 최솟값
#3) 각 동전은 무한히 주어지지는 않음

n = int(input())
money = list(map(int, input().split()))
money.sort()


def find_impossible_min_value():	
	# 만들수 없는 양의 정수 금액
	if money[0] != 1:
		return 1
	# possessed: ~까지 생성가능한 금액
	possessed = 1
	
	for new in money[1:]:
		# 다음에 생성해야할 금액(소유금액보다 1원높은 금액)
		target = possessed + 1

		# 새로 들어온 값에 의해 생성될수 없는 값이 있다면 반환
		if new > target:
			return target
		# target값을 만들수 있는경우 >> 소유가능 금액 갱신
		else:
			possessed += new
		

print(find_impossible_min_value())

'알고리즘' 카테고리의 다른 글

[알고리즘] 시간 복잡도  (0) 2022.12.26
  • 문제  (이코테 P. 314)
  • 입력
  • 출력
  • 풀이
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 시간 복잡도
이동준1
이동준1

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.