https://www.acmicpc.net/problem/1026
1026번: 보물
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거
www.acmicpc.net
풀이
#include <stdio.h>
int main() {
int n; // 50까지
int a[51], b[51]; // a의 배열, b의 배열
int a_re[51], b_re[51]; // a의 재배열, b의 '원소'재배열(b의 재배열 x)
int s = 0; // 최소 합
int cnt = 0;
scanf("%d", &n); // 길이 입력
for (int i = 0; i < n; i++) // a배열 원소 입력
scanf("%d", &a[i]);
for (int i = 0; i < n; i++) // b배열 원소 입력
scanf("%d", &b[i]);
// a_re = a 배열 내림차순
for (int s = 100; s >= 0; s--) { // 100에서 0까지 큰수부터 -
for (int i = 0; i < n; i++) {
if (a[i] == s) { // a[i]와 s가 같을때
a_re[cnt] = s; // a_re의 0번째부터 채우기
cnt++;
}
}
}
cnt = 0; // 초기화
// b_re = b 배열을 오름차순 정렬하기 위한 i를 저장
for (int s = 0; s <= 100; s++) { // s를 최소부터 100까지
for (int i = 0; i < n; i++) {
if (b[i] == s) { // b[i]가 s와 같을때
b_re[cnt] = i; // b_re의 0번째부터 채우기
cnt++;
}
}
}
for (int i = 0; i < n; i++) {
s += a_re[i] * b[b_re[i]]; // a의 최대값과 b의 최소값을 곱해서 덧셈
}
printf("%d\n", s);
return 0;
}
문제의 목표는 S를 가장 작은 값으로 만드는 것이다.
A를 내림차순으로 재배열하고, B를 오름차순으로 재배열해서 곱하고 더하면 쉽게 구할수 있겠지만
본문에서 B는 재배열하지 않는다고 말한다.
그렇기 때문에 a_re에는 a를 내림차순으로 재배열시킨것을 저장하고
b_re에는 b배열을 오름차순으로 '참조' 할 수 있게끔 인덱스를 저장한다.
'코딩 > 백준 문제 (실버)' 카테고리의 다른 글
[백준/2941/C언어] 크로아티아 알파벳 _ 풀이 (0) | 2023.08.23 |
---|---|
[백준/2563/C언어] 색종이 _ 풀이 (0) | 2023.08.22 |
[백준/1316/C언어] 그룹 단어 체커 _ 풀이 (0) | 2023.08.21 |
[백준/1193/C언어] 분수찾기 _ 풀이 (0) | 2023.08.19 |
[백준/11728/C언어] 배열 합치기 _ 풀이 (0) | 2023.08.14 |