본문 바로가기
  • 시 쓰는 개발자
알고리즘/코테 스터디 (2022)

11/07 스터디

by poetDeveloper 2022. 11. 7.

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)

'알고리즘 > 코테 스터디 (2022)' 카테고리의 다른 글

11/20 스터디  (0) 2022.11.21
11/16 스터디  (0) 2022.11.16
11/14 스터디  (0) 2022.11.14
11/09 스터디  (0) 2022.11.09
11/02 스터디  (0) 2022.11.07