Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 트리
  • 유니온 파인드
  • 이분탐색
  • UC++
  • 문자열
  • 위상 정렬
  • SCC
  • 우선순위큐
  • 스택
  • 수학
  • C++
  • 투포인터
  • 트라이
  • 정렬
  • 동적계획법
  • KMP
  • 브루트포스
  • 조합론
  • LCA
  • 기하
  • 백트래킹
  • 구현
  • 큐
  • 누적합
  • 세그먼트 트리
  • 정수론
  • 최소 스패닝 트리
  • 그래프
  • 백준
  • 분할정복

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 1026번 문제
공부 및 정리/백준 코드

[C++]백준 - 1026번 문제

2021. 10. 23. 16:55

1026번: 보물 (acmicpc.net)

 

1026번: 보물

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

www.acmicpc.net

 

1026번 : 보물


옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.

길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.

 

S = A[0] × B[0] + ... + A[N-1] × B[N-1]

 

S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.

S의 최솟값을 출력하는 프로그램을 작성하시오.

 

입력


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

 

 

출력


첫째 줄에 S의 최솟값을 출력한다.

 

 

 


 

생각해 볼 점


문제에서는 B 배열을 재정렬 하지 말라고 써있었지만, 가장 쉽게 푸는 방법은

 

A 배열은 오름차순, B 배열은 내림차순으로 정렬하여 서로 곱해주는 방법입니다.

 

A : {1, 2, 3}

B : {4, 2, 1}

* :  4+4+3 = 11

다음과 같이 풀어서 제출하면 정답입니다.

 

 

만약, 문제의 조건대로 B를 그대로 두고 풀고 싶을 경우,

 

B의 index를 함께 정렬한 후, B의 index 번호에 맞추어 A의 배열을 재설정 하면 될 것입니다.

 

A : {2, 3, 1}

B : {1, 4, 2}

 

-> pair<int, int> B_clone[] = {<0,1>, <1, 4>, <2, 2>}

 

- 정렬

A : {1, 2, 3}

B_clone: {<1, 4>, <2, 2>, <0, 1>}

 

- 재배치

A : {3, 1, 2}

B : {1, 4, 2}

 

코드


#include <iostream>
#include <algorithm>
using namespace std;

int main() 
{
    int N;
    scanf("%d", &N);
    
    int *A = new int[N];
    int *B = new int[N];
    for(int i = 0; i < N; i++) scanf("%d", &A[i]);
    for(int i = 0; i < N; i++) scanf("%d", &B[i]);
    
    sort(A, A + N);
    sort(B, B + N, greater<int>());
    int result = 0;
    for(int i = 0; i < N; i++) result += A[i] * B[i];
    
    printf("%d", result);
    
    delete[] A;
    delete[] B;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 20040번 문제  (0) 2021.10.24
[C++]백준 - 1100번 문제  (0) 2021.10.24
[C++]백준 - 11779번 문제  (0) 2021.10.23
[C++]백준 - 18111번 문제  (0) 2021.10.22
[C++]백준 - 17387번 문제  (0) 2021.10.22
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 20040번 문제
    • [C++]백준 - 1100번 문제
    • [C++]백준 - 11779번 문제
    • [C++]백준 - 18111번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바