728x90
반응형

기본적인 그리디 알고리즘 문제이다. 

for _ in range(int(input())):
    j, N = map(int, input().split())
    li = []
    for i in range(N):
        r, c = map(int, input().split())
        li.append(r*c)
    li.sort(reverse=True)
    cnt = 0
    while j > 0:
        j -= li[cnt]
        cnt += 1
    print(cnt)
728x90
반응형
728x90
반응형

기본적인 우선순위 큐 문제이다.

import heapq

n, m = map(int, input().split())
q = list(map(int, input().split()))
heapq.heapify(q)
for _ in range(m):
    a = heapq.heappop(q)
    b = heapq.heappop(q)
    heapq.heappush(q, a+b)
    heapq.heappush(q, a+b)
print(sum(q))
728x90
반응형
728x90
반응형

단순 문자열 문제이다. 1은 앞에서부터, 0은 뒤에서부터 지워주면 된다.

li = list(input())
zero, one = li.count('0')//2, li.count('1')//2
for _ in range(zero):
    li.pop(-li[::-1].index('0')-1)
for _ in range(one):
    li.pop(li.index('1'))
print(''.join(li))
728x90
반응형
728x90
반응형

그리디 알고리즘 & BFS 문제이다.

from collections import deque

def bfs(A, B):
    cnt = 1
    queue = deque()
    queue.append((A, cnt))
    while queue:
        node, cnt = queue.popleft()
        if node == B:
            return cnt
        if node*2 <= B:
            queue.append((node*2, cnt+1))
        if int(str(node)+'1') <= B:
            queue.append((int(str(node)+'1'), cnt+1))
    return -1

A, B = map(int, input().split())
print(bfs(A, B))
728x90
반응형
728x90
반응형

그리디 알고리즘 & 덱 문제이다.

덱의 맨 처음 값보다 t가 크다면 덱의 맨 뒤에 t를 추가, 그렇지 않다면 덱의 맨 앞에 t를 추가해주면 된다. 

from collections import deque

for _ in range(int(input())):
    N = int(input())
    li = deque(input().split())
    queue = deque(li.popleft())
    while li:
        t = li.popleft()
        if t > queue[0]:
            queue.append(t)
        else:
            queue.appendleft(t)
    print(''.join(queue))
728x90
반응형
728x90
반응형

그리디 알고리즘 & 스택 문제이다. 스택을 활용하지 않으면 시간 초과가 나온다. 

제일 큰 수로 만들려면 앞에 있는 작은 수부터 없애버려야 한다는 점이 핵심인 것 같다.

N, K = map(int, input().split())
li = list(input())
k, stack = K, []
for i in range(N):
    while k > 0 and stack and stack[-1] < li[i]:
        stack.pop()
        k -= 1
    stack.append(li[i])
print(''.join(stack[:N-K]))

 

728x90
반응형
728x90
반응형

그리디 알고리즘 문제이다. max(B-A, C-B)-1가 핵심이다. 

while 1:
    try:
        A, B, C = map(int, input().split())
        print(max(B-A, C-B)-1)
    except:
        break
728x90
반응형
728x90
반응형

그리디 알고리즘 문제이다. Python3로 제출하니 시간 초과가 나와서 PyPy3로 제출했다.

N = int(input())
li = list(map(int, input().split()))
res = []
for i in range(N-1):
    cnt = 0
    for j in range(i+1, N):
        if li[i] > li[j]:
            cnt += 1
        else:
            break
    res.append(cnt)
print(max(res))
728x90
반응형
728x90
반응형

그리디 알고리즘 문제이다. 박스 용량의 합에 박스에 들어간 책 크기의 합을 빼주면 된다 -> sum(box) - in_box

N, M = map(int, input().split())
box = list(map(int, input().split()))
book = list(map(int, input().split()))
i = j = t = in_box = 0
while i < N and j < M:
    if box[i] < t+book[j]:
        t = 0
        i += 1
    else:
        in_box += book[j]
        t += book[j]
        j += 1
print(sum(box)-in_box)    
728x90
반응형
728x90
반응형

그리디 알고리즘은 최적해를 구하는 데에 사용되는 근사적인 방법으로, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다.

정렬을 사용하면 쉽게 풀 수 있는 그리드 알고리즘 문제들이 되게 많다.

 

백준 알고리즘 문제 풀이)

jinho-study.tistory.com/62

 

백준 알고리즘 1931번 회의실배정(python)

그리디 알고리즘 문제이다. 정렬을 사용하면 쉽게 풀 수 있다! lambda를 사용해 끝나는 시간 순으로 정렬해주는 게 핵심이다. li = [list(map(int, input().split())) for _ in range(int(input()))] li = sorted(..

jinho-study.tistory.com

jinho-study.tistory.com/111

 

백준 알고리즘 2839번 설탕 배달(python)

5킬로그램짜리를 최대한 많이 배달하는 게 포인트다. 입력 N이 5로 나누어질 때까지 3을 계속 빼고 이 과정을 몇 번 반복했는지 새면 된다. 3을 계속 빼도 끝까지 5로 나누었을 때 0이 안된다면 N킬

jinho-study.tistory.com

jinho-study.tistory.com/198

 

백준 알고리즘 11399번 ATM(python)

우선 입력을 리스트에 저장하고 오름차순 정렬해준다. 그 후 첫 번째 값부터 마지막 값까지 누적 값을 순서대로 더해주면 된다. EX) 입력: 3, 1, 4, 3, 2 리스트로 만든 후 정렬 -> [1, 2, 3, 3, 4] 누적 값

jinho-study.tistory.com

jinho-study.tistory.com/195

 

백준 알고리즘 11047번 동전 0(python)

K이하인 동전 중에서 제일 큰 것부터 순서대로 꽉꽉 채운다는 느낌으로 풀면 된다. EX) K = 4200, 입력: 1 5 10 50 100 500 1000 5000 10000 50000 ans = 0 1) 4200 - 1000*4 = 200 -> ans = 0 + 4 = 4 2) 200 - 1..

jinho-study.tistory.com

jinho-study.tistory.com/301

 

백준 알고리즘 5585번 거스름돈(python)

11047번 동전 0과 거의 똑같은 문제이다. 거스름돈보다 싼 동전 중에서 제일 큰 것부터 순서대로 꽉꽉 채운다는 느낌으로 풀면 된다. change = 1000 - int(input()) cnt = 0 for c in [500, 100, 50, 10, 5, 1]: i..

jinho-study.tistory.com

jinho-study.tistory.com/39

 

백준 알고리즘 1541번 잃어버린 괄호(python)

처음으로 '-'가 나오는 순간부터 그 뒤에 있는 숫자들은 무조건 빼야 된다는 것을 이해하면 간단하게 풀 수 있다! EX) 입력이 "55+10-50+40-20+20"이면 li = ["55+10", "50+40", "20+20"]가 되는데 처음 요소인 "5.

jinho-study.tistory.com

jinho-study.tistory.com/75

 

백준 알고리즘 2217번 로프(python)

k개의 로프를 사용할 때 들어 올릴 수 있는 중량은 버틸 수 있는 중량이 제일 작은 로프의 최대 중량 * k라는 점이 핵심이다. EX) 15, 10 로프 2개를 사용할 경우 최대 10 * 2 = 20인데 이유는 15가 10보

jinho-study.tistory.com

jinho-study.tistory.com/36

 

백준 알고리즘 1449번 수리공 항승(python)

물이 샌 곳을 막는데 막대기는 왼쪽 끝과 오른쪽 끝 0.5를 제외한 1만큼의 여유가 필요하다. 현재 물이 샌 곳에 테이프 길이를 더하고 1을 뺀 값이 다음 물이 샌 곳보다 작으면 막대기 한 개가 필

jinho-study.tistory.com

jinho-study.tistory.com/302

 

백준 알고리즘 1439번 뒤집기(python)

입력으로 받은 문자열이 0에서 1로, 1에서 0으로 총 몇 번 바뀌는지를 구하면 쉽게 풀 수 있다. 홀수번 바뀔 경우 -> cnt//2 + 1 짝수번 바뀔 경우 -> cnt//2 s = input() cnt = 0 for i in range(len(s)-1): if s..

jinho-study.tistory.com

jinho-study.tistory.com/303

 

백준 알고리즘 2847번 게임을 만든 동준이(python)

마지막 레벨의 점수부터 확인을 하는데, 만약 뒷 단계보다 앞 단계의 점수가 더 크다면 앞 단계의 점수를 뒷 단계의 점수보다 1 작게 되도록 빼주면 된다. N = int(input()) li = [int(input()) for _ in range(N

jinho-study.tistory.com

jinho-study.tistory.com/304

 

백준 알고리즘 1946번 신입 사원(python)

서류심사 성적을 기준으로 오름차순 정렬 -> 면접 성적의 최솟값(확인한 것 중 제일 높은 순위)이 몇 번 업데이트되는지 확인 for _ in range(int(input())): N = int(input()) li = [list(map(int, input().split..

jinho-study.tistory.com

jinho-study.tistory.com/305

 

백준 알고리즘 4796번 캠핑(python)

간단한 수학 문제이다. min(V%P, L) 부분이 핵심인 것 같다. i = 1 while 1: L, P, V = map(int, input().split()) if L == 0 and P == 0 and V == 0: break res = L*(V//P) + min(V%P, L) print("Case {0}: {1}"...

jinho-study.tistory.com

jinho-study.tistory.com/306

 

백준 알고리즘 13305번 주유소

기름 가격의 최솟값을 잘 사용하면 쉽게 풀 수 있다. -> res += 현재까지 확인한 기름 가격들의 최솟값 * 현재 가야 되는 거리 EX) dis = [2, 3, 1], oil = [5, 2, 4, 1] 처음엔 기름 가격의 최솟값이 5이므로 5*

jinho-study.tistory.com

https://jinho-study.tistory.com/1101

 

백준 알고리즘 11256번 사탕(python)

기본적인 그리디 알고리즘 문제이다. for _ in range(int(input())): j, N = map(int, input().split()) li = [] for i in range(N): r, c = map(int, input().split()) li.append(r*c) li.sort(reverse=True) cnt..

jinho-study.tistory.com

 

728x90
반응형

+ Recent posts