🖥️ 시작하며
보통 그냥 B 배열의
max
값과 A 배열의 min
값을 곱하고 각각의 값들을 pop
처리시켜 푸는 방식을 채용했던데, 나는 B 배열을 기준으로 A 배열을 재정렬시키는 방식으로 해결했다.C언어에서는 어차피 배열의 최대 크기는 100이기 때문에, 이를 카운팅해서 가장 작은 값부터 A의 가장 큰 값을 곱하도록 구현했다.
⚙️ 코드
import sys def Solution(A, B): A_sorted = sorted(A) # B의 값이 큰 순서대로 인덱스를 정렬 sorted_indices = sorted(range(len(B)), key=lambda i: -B[i]) # A_sorted의 작은 값부터 B의 큰 값에 대응 assigned_A = [0] * len(A) for a, i in zip(A_sorted, sorted_indices): assigned_A[i] = a S = sum(a * b for a, b in zip(assigned_A, B)) return S if __name__ == "__main__": input = sys.stdin.readline N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) result = Solution(A, B) print(result)
#include <stdio.h> #include <stdlib.h> #define MAX_N 50 #define MAX_VALUE 100 int A[MAX_N]; int B_count[MAX_VALUE + 1] = {0}; int compare(const void *a, const void *b) { return *(int *)b - *(int *)a; // 내림차순 정렬 } long long treasure(int N) { long long sum = 0; int B_index = 0; qsort(A, N, sizeof(int), compare); for (int i = 0; i < N; i++) { while (B_count[B_index] == 0) { B_index++; } sum += (long long)A[i] * B_index; B_count[B_index]--; } return sum; } int main() { int N; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &A[i]); } int B; for (int i = 0; i < N; i++) { scanf("%d", &B); B_count[B]++; } long long result = treasure(N); printf("%lld\n", result); return 0; }
댓글