Algorithm 243

[백준 2217번] 로프

n = int(input()) solution = 0 weight_list = [] for i in range(n): weight_list.append(int(input())) weight_list.sort() list_len = len(weight_list) for i in range(list_len): temp = (list_len-i)*weight_list[i] if temp > solution: solution = temp print(solution) 이번 문제는 로프의 개수를 임의로 정하여 로프가 버틸 수 있는 최대 중량을 구하는 문제이다. 이 문제의 핵심은 로프들을 사용하여 각 로프가 w/k 만큼의 중량이 걸리게 된다면, 아무리 평균이 높더라도 결국 (각 로프 중량의 최소 값 * 나머지 로프의..

Algorithm/Greedy 2023.02.09

[백준 5585번] 거스름돈

n = int(input()) change = 1000 - n money_unit = [500,100,50,10,5,1] count = 0 for i in money_unit: if change//i > 0: count += (change//i) change %= i print(count) 이번 문제는 그리디 알고리즘의 대표적인 기본 문제로, 그리디 알고리즘을 처음 공부할 때 내용을 이해하기 좋은 문제이다. 이 문제의 핵심은 잔돈을 최대한 적은 개수의 잔돈으로 거슬러주는 것인데, 위 문제와 같은 경우에는 모든 돈의 단위가 서로 배수 관계를 가지고 있기 때문에 단순히 금액이 큰 순서대로 거슬러 주어도 문제없이 풀 수 있다. 만약에 잔돈이 800원이고 가진 돈의 단위가 [500, 400, 100] 이라면 단..

Algorithm/Greedy 2023.02.08

[백준 1541번] 잃어버린 괄호

expression = input() # '-'를 기준으로 분할 # ex) ['00009','00009+00008'] split_exp = expression.split('-') for i in range(len(split_exp)): # 분할된 문자열들을 순서대로 '+'를 기준으로 분할 후 합을 구하기(내부는 +로만 이루어져 있기 때문) # 그리고 동시에 앞에 0으로 채워진 문자열들을 정수화 시킨다 # ex) [9, 17] split_plus = list(map(int,split_exp[i].split('+'))) split_exp[i] = sum(split_plus) # 첫 번째 원소를 제외한 나머지 원소들은 '-'를 기준으로 파싱되었기 때문에 모두 빼주면 된다. # ex) 9 - 17 print(s..

Algorithm/Greedy 2023.02.08

[백준 1026번] 보물

n = int(input()) a = list(map(int,input().split())) b = list(map(int,input().split())) a.sort() a_resort = [0] * n b_index = [] for i in range(n): b_index.append((i,b[i])) b_index.sort(key=lambda x:-x[1]) for i in range(n): a_resort[b_index[i][0]] = a[i] sum = 0 for i in range(n): sum += (a_resort[i] * b[i]) print(sum) 이번 문제는 전형적인 Greedy 알고리즘 문제로 난이도는 크게 어렵지 않았다. 이 문제의 핵심은 배열 A의 원소와 B의 원소간의 곱이 최..

Algorithm/Greedy 2023.02.07

[백준 1931번] 회의실 배정

# 회의실 배정 n = int(input()) list = [] count = 0 last_time = 0 for i in range(n): start, end = map(int,input().split()) list.append((start,end)) # 시작시간 기준으로 오름차순 정렬 list.sort(key=lambda x:x[0]) # 종료시간 기준으로 오름차순 정렬 list.sort(key=lambda x:x[1]) # 회의 시간이 겹치지 않도록 회의 선정 for i in list: if i[0] >= last_time: count += 1 last_time = i[1] print(count) 이번 문제는 본인이 문제를 잘못 읽게 되어 많이 헤맸던 문제였다. 여태까지 그리디 문제를 풀 때 주어진..

Algorithm/Greedy 2023.02.07

[백준 11047번] 동전 0

n, k = map(int,input().split()) value = [] count = 0 for i in range(n): value.append(int(input())) value.sort(reverse=True) while k!=0: for i in value: if k//i > 0: count += k//i k %= i print(count) 이번 문제는 대표적인 Greedy 알고리즘 문제로, 주어진 동전 단위들을 가지고 최소한의 동전을 사용하여 금액(k)를 만드는 것이 핵심이다. 여기서 가장 중요한 조건은 바로 A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수이다. 왜 저 조건이 중요한지 생각해보면, 이 문제를 간단하게 탐욕적으로 접근해서 풀 수 있는 이유는 가지고 있는 동전 중에서 ..

Algorithm/Greedy 2023.02.07

[백준 11399번] ATM

# ATM n = int(input()) time_list = list(map(int,input().split())) time_list.sort() total = 0 solution = 0 for i in time_list: total = total + i solution += total print(solution) 이번 문제는 각 사람들이 돈을 인출하는데 걸리는 시간의 합에 대한 최솟값을 구하는 문제였는데, 난이도는 상당히 쉬운 편에 속하여 3분도 되지 않아 풀 수 있었다. (그래서 정답률이 높은 ,,) 이 문제의 핵심은 인출하는데 걸리는 시간이 적게 걸리는 순서대로 돈을 인출하는 것이다. (Greedy 알고리즘) 왜냐하면 앞의 사람이 인출하는데 시간이 오래 걸릴수록 뒤에 있는 사람들은 그 시간만큼 기..

Algorithm/Greedy 2023.02.06

[백준 2839번] 설탕 배달

n = int(input()) soluton = 0 # 먼저 3의 배수인 경우랑 5의 배수인 경우 처리 # 3의 배수는 3의 개수를 5로 나눠서 몫 *3 + 나머지 if n%3 == 0: soluton = n // 3 soluton = ((soluton//5)*3) + (soluton%5) # 5의 배수는 그대로 elif n%5 == 0: soluton = n//5 # 5를 먼저 빼고 3으로 나눠지는지 확인 # 3으로 나눠지면 3으로 나눠서 그 몫을 더해주고 끝 # 3으로 나눠지지 않으면 5 한번더 빼기 else: while n != 0: # n이 1~2 이 되면 답이 X if n 0: soluton = -1 break # 5보다 크거나 같은 경우엔 5빼기 if n >= 5 : so..

Algorithm/Greedy 2023.02.06

[이코테] 무지의 먹방 라이브

이번 문제는 단순하게 주어진 k 시간만큼 모든 음식들을 접근하여 다음 인덱스를 찾게 되면 정확성 및 효율성으로 인해 틀리게 되는 문제이다. 따라서 소요 시간이 적게 걸리는 음식부터 하나씩 먹어 치운 후에, 주어진 k 시간에서 남은 시간동안 가장 적게 시간이 걸리는 음식을 먹지 못할 때 그 나머지 값을 인덱스로 리턴하면 풀리게 되는 문제이다. 이 문제의 핵심은 모든 음식을 소요 시간을 기준으로 정렬한 뒤에, 시간이 적게 걸리는 음식부터 제거해 나가는 것이다. 이 문제를 접근하기 위해 내게 부족했던 파이썬 문법들은 다음과 같다. '음식을 먹는게 소요되는 시간'과 '인덱스'를 동시에 저장하기 위해서 Tuple 자료형을 사용할 수 있다는 점 sorted나 .sort로 정렬할 때 두번째 인자로 key 값을 부여하..

Algorithm/Greedy 2023.02.05