Algorithm/Greedy 20

[백준 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

[이코테] 볼링공 고르기

1. 본인 코드 n, m = map(int,input().split()) weight = list(map(int,input().split())) weight.sort() count = 0 # 리스트 집합화(원소의 값만 추출하기 위함) weight_set = set(weight) weight_value = list(weight_set) for i in weight_value: tempList = [j for j in weight if j > i] # 현재 i 값보다 큰 무게를 가진 공들만 추출(리스트 컴프리헨션 사용) count += (weight.count(i) * len(tempList)) # (현재 i 개수) * (무게가 더 큰 공 개수) = 조합의 개수 print(count) # 소요시간 : 0.0..

Algorithm/Greedy 2023.02.02

[이코테] 큰 수의 법칙

1. 교재 답안 # 교재 답안 # N, M, K를 공백으로 구분하여 입력받기 n,m,k = map(int,input().split()) # N개의 수를 공백으로 구분하여 입력받기 data = list(map(int,input().split())) total = 0 data.sort(reverse=True) count = int(m/(k+1))*k count += m%(k+1) total += count*data[0] total += (m-count)*data[1] print(total) 2. 본인의 답안 # 본인 풀이 n, m, k = map(int,input().split()) arr = list(map(int,input().split())) arr.sort(reverse=True) a = m // (..

Algorithm/Greedy 2023.01.29