[백준] 1026번 보물 c++

2021. 6. 26. 00:00·알고리즘 이론/백준
목차
  1. 1026. 보물 

1026. 보물 

 

1026번: 보물

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

www.acmicpc.net

 

 

제출 수가 굉장히 큰 것을 보아, 알고리즘의 기초를 다루는데 있어 의미있는 문제라고 생각한다. 


풀이:

 

문제에서 B는 재배열하면 안된다는 조건을 주었지만, 아이러니하게도 해당 알고리즘을 구현하는데 있어서 B의 순서를 바꾸어도 정답에는 아무런 영향이 없다. 

 

우선 주어진 배열의 길이 N은 50보다 작거나 같은 자연수이기 때문에 시간제한은 크게 걱정하지 않아도 된다. 

다만 매번 주의 깊게 살펴볼 것은 문제에서 배열의 원소들이 제시될 때, 이 원소들이 이어서 주어지는지 아님 띄어져서 제시되는 지를 살펴볼 필요가 있다. 제시되는 방법에 따라 입력값을 받는 코드의 형태가 달라지기 때문에 매번 확인 할 필요가 있다. 필자의 경우, 해당 사항을 매번 놓쳐서 전혀다른 곳에서 삽질하는 경우가 많았다 ㅜ

 

다시 보물 문제로 돌아가보자.

문제에서 배열의 주어질 때 해당 배열의 원소가 띄어서주어진다.

때문에 백터 a와 b를 생성하고 각각의 벡터에 주어진 정수들을 저장했다.

for (int i = 0; i < num; i++) {
		cin >> k;
		a.push_back(k);
	}
for (int i = 0; i < num; i++) {
		cin >> k;
		b.push_back(k);
	}

그리고 벡터 a는 원소들을 오름차순으로 정렬하고, 벡터 b는 내림차순으로 정렬했다.

S = A[0]×B[0] + ... + A[N-1]×B[N-1]의 형태인 함수 S의 값을 최소로 만들기 위해서는 a벡터의 가장 작은 정수와 b벡터의 가장 큰 수가 순차적으로 곱해져야하기 때문이다. 

벡터에서 오름차순정렬은 굉장히 쉽다. 바로 sort(v.begin(),v.end())형태의 c++ 표준 라이브러리 함수를 이용한다.

내림차순 정렬도 유사하게 sort(v.rbegin(), v.rend())형태로 r을 붙여 reverse를 나타내거나 reverse(v.begin(),v.end())를 이용하면 쉽게 나타낼 수 있다.

 

sort(a.begin(), a.end());
sort(b.rbegin(), b.rend());

 

마지막으로는 문제에 주어진 S함수만 구현하면 된다.

for()문을 이용하여, a와 b벡터의 원소를 순차적으로 곱해주고 그 값을 새로운 변수 sum에 더해준다.

for (int i = 0; i < num; i++) {
		sum += (a[i] * b[i]);
	}

 

더보기

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> a;
vector<int> b;


int main() {
	ios::sync_with_stdio(0);
	cout.tie(); cin.tie();
	int k;
	int num;
	int sum = 0;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> k;
		a.push_back(k);
	}
	for (int i = 0; i < num; i++) {
		cin >> k;
		b.push_back(k);
	}
	sort(a.begin(), a.end());
	sort(b.rbegin(), b.rend());

	for (int i = 0; i < num; i++) {
		sum += (a[i] * b[i]);
	}

	cout << sum << "\n";
	return 0;


}
저작자표시 비영리 (새창열림)

'알고리즘 이론 > 백준' 카테고리의 다른 글

[5032] 탄산 음료 C++  (0) 2021.06.26
[백준] 2863 이게 분수?  (0) 2021.06.26
[백준] 1427 소트인사이드 c++  (0) 2021.06.26
[백준] 1065 한수 c++  (0) 2021.06.26
[백준] 2798 블랙잭  (0) 2021.06.21
  1. 1026. 보물 
'알고리즘 이론/백준' 카테고리의 다른 글
  • [백준] 2863 이게 분수?
  • [백준] 1427 소트인사이드 c++
  • [백준] 1065 한수 c++
  • [백준] 2798 블랙잭
senyalog
senyalog
개발 블로그 https://github.com/iamyunjuda
  • senyalog
    Senya의 개발 블로그
    senyalog
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 일상 (6)
      • 알고리즘 이론 (14)
        • 백준 (8)
      • 개발 (47)
        • Server (7)
        • 인턴 (11)
        • Javascript (0)
      • 경제 (4)
  • 블로그 메뉴

    • Github
    • 홈
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    카페
    개발자
    경제
    개발
    컴공
    생각
    백엔드
    일상
    C++
    nestjs
    백준
    인턴생활
    백준문제
    코딩
    대학생
    코딩테스트
    TypeScript
    이마고웍스
    서버
    대학생인턴
    MSA
    백준풀이
    인턴
    공대생
    알고리즘공부
    GIT
    알고리즘
    개발공부
    공부
    깃
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
senyalog
[백준] 1026번 보물 c++
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.