#1292: 쉽게 푸는 문제

#1292: 쉽게 푸는 문제

C++20(Clang)
#include <iostream>
#include <vector>

using namespace std;

int main() {
	int a, b;
	cin >> a >> b;
	vector<int> v;

	for(int i = 0; i <= b; i++){
		for(int j = 0; j < i; j++){
			v.push_back(i);
		}
	}

	// for(int i : v){
	// 	cout << i << " ";
	// }

	// cout << endl;
	
    v.reserve(b-a+1);
	int sum = 0;

	for(int i = a-1; i < b; i++){
		sum += v[i];
	}

	cout << sum << endl;

	return 0;
}

쉽게 풀었습니다.

v.reserve(b-a+1)

을 추가하면 어떨까요

1 Like

시간이 4ms 에서 0ms가 됐어요

어떻게 하신거죠??

확인이 늦었네여. 한 번 찾아 보셨을라남? ㅋ-ㅋ
벡터는 사용하기 정말 편리하져. 알아서 메모리 할당, 해제를 해주니까요.
대신, 알아서 메모리를 할당해주는 만큼, 메모리 할당을 한 번에 많이 하진 않아여.
필요하다 싶으면 새로 할당을 하는 방향이죠.

그래서,

v.push_back(i);

위 코드가 반복되어 메모리가 꽉 차게 되면, 새로운 메모리(A)를 할당해주고, 기존 메모리(B)의 내용들을 (A)에 복사를 해주고, 다시 (B)를 해제합니다. 이게 여러 번 반복된다고 한다면, 무수히 많은 복사와 할당, 해제가 반복되겠져?

이를 방지할 수 있는 방법이, 메모리를 할당할 크기를 미리 정하는 겁니다. 한 번에 내가 쓸 만큼 미리 할당해주면, 부수적인 복사나 할당,해제가 일어나지 않으니까요.

reserve(할당할 크기)

그런데, 위 코드를 다시 봤는데, v.reserve(b-a+1)의 위치가 v에 원소를 넣기 전이 아니라 후네요?
어떻게 빨라졌을까요? ㅋ-ㅋ;;;

1 Like

운좋게 0ms에 들어온 거 같네요
실행시간이 이거다 하고 정해지는 게 아니니… ㅋㅋㅋ

+) 써놓고 보니까 컴파일러 최적화일수도 있겠네요.

컴파일러 최적화가 맞느 것 같네연. 저게 0ms가 여러 번 돌린 것들 중에서 최대, 최소 뺀 그런 수치일거라