일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 문자열
- 정수론
- MySQL
- 백준알고리즘
- 그리디알고리즘
- 브루트포스알고리즘
- 구현
- 다이나믹프로그래밍
- 프로그래머스연습문제
- 그리디
- C++
- 이진탐색
- 백준
- Image Classification
- 해시를사용한집합과맵
- 정렬
- 큐
- 프로그래머스
- 수학
- 이분탐색
- 논문리뷰
- 논문구현
- C
- 프로그래머스sql
- 프로그래머스코딩테스트
- C언어
- SQL
- 자료구조
- 소수판정
- 사칙연산
- Today
- Total
초보 개발자의 이야기, 릿허브
[C++] 백준 1026번 보물 본문
1. 문제이해
https://www.acmicpc.net/problem/1026
길이가 N인 정수 배열 A와 B를 입력받아 S = A[0]×B[0] + ... + A[N-1]×B[N-1] 라고 할때,
S의 최솟값을 구하는 알고리즘을 구현하는 것이 목표이다.
2. 문제풀이
A와 B의 원소들을 곱하여 모두 더해 나온 여러가지 경우의 값들(S) 중 최솟값을 찾아 출력하는 문제이다.
S의 최솟값을 구하기 위해서는, A의 가장 작은 수부터 B의 가장 큰 수와 곱해나가거나,
반대로 A의 가장 큰수와 B의 가장 작은 수를 곱하는 형식으로 짝 지어 나가는 방법이 있다.
즉, A를 오름차순, B를 내림차순으로 정렬하여 곱하거나, A를 내림차순, B를 오름차순으로 정렬하여 곱해야한다.
즉, 위의 예제입력과 같이, A가 1 1 1 6 0, B가 2 7 8 3 1인 경우,
A를 오름차순으로 정리하면, 0 1 1 1 6
B를 내림차순으로 정리하면, 8 7 3 2 1
첫번째 항부터 곱해나가면, 0 + 7 + 3 + 2 + 6 = 18, 최솟값으로 18을 출력하게 된다.
3. 소스코드
#include <iostream>
#include <algorithm>
using namespace std;
// 내림차순
bool DESC(int a, int b) {
return a > b;
}
int main() {
int N;
int A[100];
int B[100];
int sum = 0;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
for (int i = 0; i < N; i++) {
cin >> B[i];
}
// A를 오름차순, B를 내림차순으로 정렬
sort(A, A + N);
sort(B, B + N, DESC);
for (int i = 0; i < N; i++) {
sum += (A[i] * B[i]);
}
cout << sum;
return 0;
}
구현하는 방법은 간단했다.
위에서 이야기 했듯이 A를 오름차순, B를 내림차순으로 정렬하던지, A를 내림차순, B를 오름차순으로 정렬하고 곱해주면 된다.
나는 전자의 경우를 이용해서 A와 B를 정렬해주고, for 문을 통해 각각의 요소들을 곱하고 더해주었다.
오랜만에 아무런 오류없이 한번에 통과한 문제였다. 🥰
블로그 포스팅을 하고 문제를 다시 보니, B는 정렬하지 말라는 조건이 하나 더 있는데,
백준에서는 오류 없이 잘 돌아갔다..
B를 정렬하지 않고 하려면, A는 정렬하고 B의 원소들 중 최댓값을 찾아나가면서 하나씩 곱해주는 방식을 이용하면 될것같은데,
조만간 시간이 되면 한번 구현해봐야겠다. 😤
'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글
[C] 백준 1676번 팩토리얼 0의 개수 (2) | 2021.08.11 |
---|---|
[C] 백준 1065번 한수 (0) | 2021.08.06 |
[C] 백준 1920번 수 찾기 (0) | 2021.08.04 |
[C] 백준 1978번 소수 찾기 (0) | 2021.08.03 |
[C] 백준 1002번 터렛 (0) | 2021.08.03 |