지금 이 순간 가장 좋다고 생각되는 것을 고르자!
500원, 100원, 50원, 10원 동전이 무한하게 있다.
손님에게 N원을 거슬러줄 때, 주어야 할 동전의 최소 개수는 몇 개일까?
단, 거슬러 주어야 할 돈 N은 항상 10의 배수이다.
coins = [500, 100, 50, 10]
N = 1260
cnt = 0
for i in coins:
cnt += (N // i)
N %= i
print(cnt)
양의 정수 N이 1이 될 때까지 연산을 수행한다.
N에서 1을 빼거나, N이 K로 나누어떨어질 때, N을 K로 나누는 2개의 경우가 있다.
이를 통해 N이 1이 되도록 하는 최소한의 수행 횟수는 몇 번일까?
# 처음 생각했던 풀이
# K로 나눌 수 있을 때까지 1씩 줄였다.
# 문제에서는 수의 크기가 크지 않았기 때문에 괜찮았지만, 매우 큰 수가 온다면?
# 1씩 줄여나가는 과정이 성능에 영향을 줄 우려가 있었다.
N, K = map(int, input().split())
cnt = 0
while N > 1:
if N % K:
N -= 1
else:
N //= K
cnt += 1
print(cnt)
# 개선된 풀이
N, K = 1map(int, input().split())
cnt = 0
while N > 1:
target = (N // K) * K # K로 나누어 떨어질 때까지 1을 빼던 과정을 간편화함!
cnt += (N - target) # 나누어 떨어질 때까지 1을 빼는 횟수를 더해주었다
N = target # 이렇게 하고 나면, N은 K의 배수가 된다.
if N < K: break
cnt += 1
N //= K # 따라서 횟수를 1 늘리고, N을 K로 나눈다.
# break문을 통해 while 루프를 빠져나왔지만, 완전히 끝이 난 것은 아니다.
# N = 25 / K = 8을 예시로 들면, while 루프를 빠져나올 때의 cnt 값은 5가 되어버린다.
# 25에서 24로 1을 빼면서 한 번(target = 24), 8로 나누면서 한 번
# 이 시점에서의 cnt는 2, N은 3이다.
# 다음 루프에서, (3 // 8) * 8의 값은 0이고, target은 0이 된다.
# 따라서 cnt += (N - target)로 인해 cnt에는 3이 더해져버리고, cnt가 5가 된 채로 빠져나온다.
# 그러나 실제 3에서 1까지 빼려면 2번의 연산이 더해지게 되고, cnt는 4가 되어야 한다!
# 1을 빼야 한다.
cnt += (N - 1)
print(cnt)
각 자리가 0 ~ 9로 이루어진 문자열 S가 주어진다.
왼쪽부터 오른쪽으로 모든 숫자를 확인하며 숫자 사이에 +나 *를 넣을 수 있다.
이를 통해 만들어질 수 있는 수 중 가장 큰 수는 얼마일까?
모든 연산은 왼쪽부터 이루어진다.
# 처음 생각한 코드
S = '02984'
ans = 1
for i in range(len(S)):
if int(S[i]) == 0:
ans += int(S[i])
else:
ans *= int(S[i])
print(ans)
# 그러나 1을 생각하지 못했다.
# 1인 경우 곱하기보다는 더해주는 것이 더 큰 값을 만들 수 있다!
# 개선된 풀이
S = '029841'
ans = int(S[0]) # 이렇게 하면 for 루프에서의 연산을 1회 줄일 수 있다.
for i in range(1, len(S)):
if int(S[i]) < 2 or ans < 1: # 0번째 idx의 값이 1 이하인 경우를 대비해 ans < 2 조건 추가
ans += int(S[i])
else:
ans *= int(S[i])
print(ans)
모험가 N명이 있다.
공포도가 X인 모험가는 반드시 X명 이상으로 구성된 모험가 그룹에 들어가야만 한다.
N명의 모험가 정보가 주어졌을 때, 만들 수 있는 그룹 수의 최댓값은 얼마일까?
모든 모험가를 특정 그룹에 넣을 필요는 없다.
# 처음 생각한 코드
N = int(input())
people = list(map(int, input().split()))
cnt = 0
people.sort()
while people:
temp = 0
isValid = False
for i in range(len(people)):
if people[i] <= people[0]:
temp += 1
if temp == people[0]:
cnt += 1
people = people[people[0]:]
isValid = True
break
if not isValid: break
print(cnt)
# 만들고 나서 풀이 코드를 보니 while 루프를 쓸 필요가 없었다.
# 주어진 배열을 정렬하는 것까지는 같았지만, 단순히 전체를 순회하면서 값을 비교하고 조건에 따라 그룹을 생성해주는 방법이 있었다.
# 주어진 풀이 코드
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0 # 그룹의 수
count = 0 # 그룹에 포함된 모험가의 수
for i in data:
count += 1
if count >= i: # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면 그룹 결성
result += 1 # 그룹 수 증가
count = 0 # 모험가 수 초기화
print(result)