본문 바로가기

CS Study/algorithm

그리디 알고리즘 (문제 풀이)

1. 설탕 배달 (백준 2839번)

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

직접 작성한 코드)

 

n=int(input())
count=0
k=n
five= k//5
k=k%5
three=k//3
k=k%3


while True:
    
    if k==0:
        print(five+three)
        break

    elif five<=0:
        if k%3==0:
            three+=k//3
            print(three)
            break
        else:
            print(-1)
            break
    
        
    else :
        
        five-=1
        k=k+5
       
        three+=k//3
        k=k%3


아이디어: 입력받은 수를 5로 최대한 많이 나누고 반복문을 돌면서 5씩 증가시키며 3으로 나누어지는지 확인한다. (3으로 나누는 것 보다 5로 나누는 것이 무조건 큰 경우이기 때문에 적용 가능하다.)

 

5를 나눈 몫이 0이하인데 3으로도 나눠지지 않는다면 -1를 출력한다. 

 

참고 답안) 

 

n = int(input())

if n % 5 == 0:  
    print(n // 5)
else:
    p = 0
    while n > 0:
        n -= 3
        p += 1
        if n % 5 == 0: 
            p += n // 5
            print(p)
            break
        elif n == 1 or n == 2: 
            print(-1)
            break
        elif n == 0: 
            print(p)
            break

 

 

2. ATM(백준 11399번)

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

직접 작성한 코드)

 

n=int(input())
array=list(map(int,input().split()))
array.sort()
result=0
count=n

for i in range(n):
    result+=array[i]*count
    count-=1
    
print(result)

 

 

3.  동전 0 (백준 11037번)

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 

직접 작성한 코드)

 

n,k=map(int,input().split())
array=[]
result=0
for i in range(n):
    array.append(int(input()))

for j in range(n-1,-1,-1):
   
    result+=k//array[j]
    k=k%array[j]

print(result)

 

 

4. 보물 (백준 1026번)

https://www.acmicpc.net/problem/1026

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

 

직접 작성한 코드)

 

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
result=0
a.sort()
b.sort(reverse=True)

for i in range(n):
    result+=a[i]*b[i]

print(result)

 

5. 잃어버린 괄호 (백준 1541번)


https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

직접 작성한 코드)

 

import re
a=input()
numbers=re.findall(r'\d+',a)
calculation=[]
num=[]

for i in a:
    if i=='-' or i=='+':
        calculation.append(i)


for i in range(len(calculation)):
    if calculation[i]=='+':
        numbers[i+1]=int(numbers[i])+int(numbers[i+1])                             
        numbers[i]=0

while 0 in numbers:
    numbers.remove(0)
result=int(numbers[0])*2

for i in numbers:
    result-=int(i)

print(result)

 

아이디어: 결과가 최소가 되려면 뺄셈을 하는 수가 커야한다.

더하기 연산을 우선적으로하고, 이후에 뺄셈을 한다. 

 

참고 답안)

exp = input().split("-")
ans = 0
for i in exp[0].split("+"):
    ans += int(i)

for i in exp[1:]:
    for j in i.split("+"):
        ans -= int(j)

print(ans)

'CS Study > algorithm' 카테고리의 다른 글

DFS & BFS 문제 풀이  (0) 2022.07.19
정렬 알고리즘 (문제 풀이)  (0) 2022.07.14
최단 경로 알고리즘  (0) 2022.07.12
다이나믹 프로그래밍  (0) 2022.07.11
다이나믹 프로그래밍 2 (이론 정리)  (0) 2022.07.08