본문 바로가기

백준 - 최솟값 찾기(11003) 본문

개발/알고리즘

백준 - 최솟값 찾기(11003)

Seongjun_You 2024. 10. 9. 21:38

 

 

다음과 같은 예시가 있다고 가정하면

L=3

 

 

1  5  2  3  6  2  3  7  3  5  2  6

idx = 0     1

idx = 1     1  5

idx = 2     1  5  2

idx = 3     5  2  3

idx = 4     2  3  6

idx = 5     3  6  2

idx = 6     6  2  3

idx = 7     2  3  7

idx = 8     3  7  3

idx = 9     7  3  5

idx = 10   3  5  2

idx = 11   5  2  6

 

각 구간마다 최솟값을 출력하는 게 목표이다.

 

 

 

실패한 첫번째 시도

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int sub_main()
{
	int n, l;
	cin >> n >> l;
	vector<int> data(n, 0);
	for (int i = 0; i < n; i++) cin >> data[i];

	for (int i = 1; i <= n ; i++)
	{
		if (i < l) {
		
			int min_data = *min_element(data.begin(), data.begin() + i);
			cout << min_data << " ";
	
		}
		else {
			int min_data = *min_element(data.begin() + i - l, data.begin() + i);
			cout << min_data << " ";
		}
				  
	}
	return 0;
	
}

 

당연히 시간초과가 났다.

각 구간 반복문으로 돌려 최솟값을 일일이 찾아주는 코드이다.

 

 

 

 

두 번째 시도는 우선순위 큐를 이용했다.

pop을 위해서 인덱스도 같이 넣어주었다.

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	int n, l;

	cin >> n >> l;
	vector<int> data(n, 0);
	for (int i = 0; i < n; i++) cin >> data[i];

	for (int i = 0; i < n; i++)
	{

		pq.push({ data[i], i });
		
		while (pq.top().second <= i - l) {
			pq.pop();
		}

		cout << pq.top().first << " ";
	}



}

                                                             

pq의 최솟값을 계속 확인해 주면 되지만

그전에 인덱스에 벗어난 값이면 pop을 해준다.

 

 

 

 

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

입출력 최적화 코드를 넣지 않으면 통과할 수 없다.

'개발 > 알고리즘' 카테고리의 다른 글

백준 - 행성터널(2887)  (0) 2024.10.25
백준 - 찾기(1786)  (0) 2024.10.15
백준 - 히스토그램에서 가장 큰 직사각형(6549)  (0) 2024.10.07
백준 - 테트로미노(14500)  (0) 2024.09.30
백준 - 빗물(14719)  (0) 2024.09.24
Comments