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

 

1026번: 보물

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

www.acmicpc.net


문제 해결을 위한 과정

이 문제는 단순한 그리디 알고리즘 문제입니다. 각각의 배열의 원소들을 곱한 후 합을 의미하는 S가 가장 작으려면

a 리스트의 가장 작은 값과 b 리스트의 가장 큰 값을 곱한 후 각각의 배열의 원소들을 곱한 후 합하면 됩니다.


소스코드
1
2
3
4
5
6
7
8
9
10
11
12
= int(input())
= list(map(int, input().split()))
= list(map(int, input().split()))
 
a.sort()
b.sort(reverse = True)
 
sum = 0
for i in range(n):
  sum += (a[i] * b[i])
 
print(sum)
cs

 

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

 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net


문제 해결을 위한 과정

이 문제의 경우 그리디 알고리즘으로 해결할 수 있는 문제입니다. 그리디 알고리즘의 개념만 정확히 알고 있다면 쉽게 풀 수 있는 문제입니다. 가장 최선의 경우를 선택하는 경우 이기 때문입니다. 먼저 문제를 예를 들어봅시다. 

 

맨 처음 비용을 5로 잡았을때 다음 비용은 2 이므로 (5 < 2) 이 구간의 거리 즉 2만큼은 5라는 비용으로 이동합니다. 그 후 비용을 2로 갱신해줍니다.

5 * 2 = 10

 

비용을 2로 잡은 후 다음 비용은 4 이므로 (2 < 4) 이므로 다음 비용까지 비용 2를 유지합니다. 다음 비용은 1 이므로 갱신해 줍니다. 즉 3 + 1의 구간은 2라는 비용으로 이동합니다. 

2 * (3 + 1) = 8

 

비용은 1 이지만 마지막 구간이므로 종결합니다.

따라서 답은 10 + 8로 최소는 18입니다


소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
= int(input())
route = list(map(int, input().split()))
amount = list(map(int, input().split()))
 
price = amount[0]
ans = 0
= 1
ro = route[0]
while True:
  if i == n-1:
    ans += price * ro
    break
  if price < amount[i]:
    ro += route[i]
  else:
    ans += price * ro
    price = amount[i]
    ro = route[i]
  i += 1
 
print(ans)
cs

+ Recent posts