11047 동전 0
정렬을 하면 시간초과, 안하면 통과되는 문제였다.
그래서 오름차순으로 입력된다는 조건을 이용해서, money_list[n-i]로 입력받아서 내림차순으로 저장되게 하였다.
그렇게 하면 정렬할 필요가 없어서 통과할 수 있었다.
그 뒤로는 전형적인 동전 문제처럼, 5만원을 최대한 넣어보고(몫으로 반환), 그다음은 1만원, 다음 5천원 .... 을 계속 반복해서 동전의 개수를 세어서 반환하였다.
import sys
n, money, = map(int, input().split())
money_list = [0] * n
for i in range(1, n+1):
money_list[n-i] = int(sys.stdin.readline().strip())
cnt = 0
i = 0
while money != 0:
if money >= money_list[i]:
cnt += money // money_list[i]
money = money % money_list[i]
i += 1
else:
i += 1
print(cnt)
11399 ATM
앞에 있는 수는 뒤에 있는 수에 영향을 주는 구조였다. 따라서 큰 수가 앞에 있을수록 뒤에 많은 수들이 더 큰 영향을 받으므로, 큰 수는 반드시 뒤로 빼야했고 작은수가 앞에 있으면 된다고 생각했다. 따라서 숫자들을 단순히 정렬했고, 이 수의 개수도 최대 1천개로 크지 않아서 가능하다고 생각했다. 그래서 정렬한 뒤, 슬라이싱해서 처음부터 cnt에 누적하며 더해주었다.
n = int(input())
time = list(map(int, input().split()))
time.sort()
cnt = 0
for i in range(n):
cnt += sum(time[:i+1])
print(cnt)
1541 잃어버린 괄호
생각보다 어려웠는데, 알고보면 쉬운 문제였다. 처음에는 입력값들을 하나씩 다 접근하면서 -가 나오면 체크하는 식으로 진행했는데 그렇게 했을 경우 숫자를 다루는 게 상당히 복잡해보였다.
그러다가 한가지 간과하던게 바로 split()함수였는데, 평소에 입력값을 받을 때 항상 input().split()만 써서 무의식중에 그냥 습관이 돼서 어떤 역할을 하는지 까먹었던 것 같다. 사실 split은 띄어쓰기를 기준으로 나누어주는 것이었다. 그렇다면 저기에 -를 넘겨주면 -를 기준으로 나눠주게 되는 것이다. 따라서 입력값을 -에 따라서 나누고, 그렇게 나뉘어진 덩어리들을 다시 +를 기준으로 나누면 숫자들만 뽑아낼 수 있다.
여기서 total과 nums의 역할이 조금 다르다. 일단 50 -60+40+30 -20 -10 이라고 있으면 -를 기준으로 총 4개로 분리된다. 그러면 이때 두번째 세번째 네번째 덩어리가 괄호로 묶어서 뺄 값들인데, total은 덩어리들의 각각의 합이고, nums는 그 합들을 저장하는 리스트이다. 즉, 60+40+30을 total에 넣어서 nums에 넣어주고 다시 20을 total에 넣어서 nums에 넣어주고 마지막으로 10을 total에 넣어서 nums에 넣어준다.
그렇게 되면 아래 for문에서 최종 계산을 해주는데, 맨 처음 값은 조건에 따라 반드시 양의 숫자가 되므로 n에 처음 값을 할당해준다. 이때 nums에 있는 값들은 모두 "빼기만 하면 되는" 값들이므로 n에서 nums의 원소들을 하나씩 빼준다. 빼기만 하면 되는 이유는, 위 for문에서 +를 기준으로 덩어리 내에서 다시 나누었고 그걸 total로 한꺼번에 더해서 nums에 있기 때문이다. 즉, 50 -60+40+30 -20 -10 이 예시에 따르면 nums에 있는 값들은 차례로 130, 20, 10이 되는 것이다. 그래서 이 값을 맨 처음 값인 50에서 빼면 50-130-20-10이 되고, 결과적으로 -110이 최솟값이 된다.
a = input().split('-') # -를 기준으로 나눈 것이기 때문에 첫번째 숫자를 제외하고는 다 빼주는 숫자들이 된다
# 즉, -가 나올때까지 하나의 그룹으로 묶어준다
# ex. 50 -50+40+60+10 -44 -56+30 -20
nums = [] # -가 붙은 숫자들을 저장해줄 리스트
for i in a: # 숫자 하나하나가 아니라 50 40같은 덩어리들이 나뉜거기 때문에 a에 바로 접근가능
total = 0
s = i.split('+') # +를 기준으로 나누고 // + 자체를 operator로 바꾸는 방법도 있는지 ???
for j in s:
total += int(j)
nums.append(total)
n = nums[0] # 첫번째는 반드시 양수 (문제조건)
for i in range(1, len(nums)): # 맨 처음 양수를 제외하고 인덱스 1부터 싹다 빼줌
n -= nums[i]
print(n)