📍 이것이 코딩테스트다(나동빈) - part3.알고리즘 유형별 기출문제 를 풀고 기록했습니다.
- N개의 동전을 가지고 있다. 이 때 N개의 동전을 이용하여 만들 수 없는 양의 정수 금액 중 최솟값은?
- 첫째 줄에 동전의 개수를 나타내는 양의 정수 N이 입력됨.(1<=N<=1,000)
- 둘째 줄에 각 동전의 화폐단위가 주어짐. (각 화폐 단위는 1,000,000 이하의 자연수)
- 예를 들어 N = 5, 화폐단위 = [3, 2, 1, 1, 9]이면 8을 출력
for i in range(1, max(list))
로 일일이 대조함.
n = int(input())
data = list(map(int, input().split()))
data.sort()
# 만들 수 없는 금액 구하는 함수
def cannot():
# 1이 포함되어있지 않으면 만들 수 없는 금액은 1
if min(data) < 1:
return 1
# 부분집합마다 합 구하기
list = []
for i in range(1<<n): #range(2^n)
s = 0
for j in range(n): #j는 data에서 인덱스
if i & (1<<j):
# A & B : A와 B의 2진수 형태에서 공통된 값을 가져와 10진수로 변환
# 공통된 값이 없다면 0이 나옴.
s += data[j]
list.append(s)
# list의 최댓값까지 확인
for i in range(1, max(list)):
if i not in list:
return i
print(cannot())
예를 들어 [1, 2, 3] 이 있다고 할 때 총 6까지 만들 수 있음
1
2
3
4 (= 1+3)
5 (= 2+3)
6 (= 1+2+3)
여기에 5원짜리 동전이 추가되면
0 +5 =5
1 +5 =6
2 +5 =7
3 +5 =8
4 +5 =9
5 +5 =10
6 +5 =11
- 1부터 11까지 만들 수 있음.
- 만약 5원이 아니라 8원이 추가된다면? : 1~6, 8~13을 만들 수 있음.
n = int(input())
data = list(map(int, input().split()))
data.sort()
target = 1
for x in data:
if target < x:
break
target += x
print(target)
target=1
for x in data
현재 화폐단위 = x, target=N 인 상황은
1
,2
,...,(N-1)
} or {x
,1+x
, 2+x
, ..., (N-1)+x
} 을 만들 수 있다. if target < x:
x
<=N
이면, 1
부터 (N-1)+x
까지 만들 수 있는 셈. N
<x
이면 N(=target)은 만들지 못함. -> break하고 '만들 수 없는 금액 중 최솟값'으로 N을 출력target+=x
x
<=N
이면, 1
부터 (N-1)+x
까지 만들 수 있는 셈이므로 target은 여기에 1을 더한 N+x 로 갱신✅ 실수 주의
target < x
에서 break 안하면 1
1~ sum(data)까지 모두 만들 수 있는 경우 result = 0 으로 그대로 나옴.
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0
target = 1
for x in data:
if target >= x:
target += x
else:
result = target
print(result )