말랑한 하루

[BAEKJOON] 2565, 5582, 22252 본문

문제풀이/BAEKJOON Online Judge

[BAEKJOON] 2565, 5582, 22252

지수는말랑이 2023. 9. 4. 15:31
반응형

※ 소스코드는 각 문제 설명 하단에 <더보기>를 통해 확인하실 수 있습니다.

 

[gold5, 2565 전깃줄] - 최장증가부분수열(LIS)

LIS의 가장 큰 특징은, 마지막 원소가 가능한 작을수록 더 긴 LIS를 생성할 수 있다
그래서 lower_bound를 활용하여, LIS의 원소를 업데이트 하면 최종 길이를 구할 수 있다

더보기
#include <iostream>
#include <algorithm>
#pragma warning(disable:4996)

using namespace std;

int N;
struct Data {
	int idx, conn;
};
Data elec_line[101];

bool elecCompare(Data a, Data b) {
	return a.idx < b.idx;
}
int main() {
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		int fs, se;
		scanf("%d %d", &fs, &se);
		elec_line[i] = { fs, se };
	}
	sort(elec_line, elec_line + N, elecCompare);

	int low[101];
	int len = 0;
	low[0] = elec_line[0].conn;
	for (int i = 1; i < N; i++) {
		if (elec_line[i].conn > low[len]) {
			low[++len] = elec_line[i].conn;
		}
		else {
			int idx = lower_bound(low, low + len, elec_line[i].conn) - low;
			low[idx] = elec_line[i].conn;
		}
	}
	printf("%d", N - len - 1);
}

 

[gold5, 5582 공통 부분 문자열] - 최장 공통 부분 문자열(Longest Common Substring)
단어가 일치하는 연속 부분 문자열을 찾는 과정은 다음과 같다
1) 문자열 A, B에 대해 행렬 DP을 초기화한다.
2) A[i] == B[j]일 때, DP[i][j] = 1이 되며, 문자열이 연속되는 경우 DP[i - 1][j - 1]에 값이 있다
2-1) DP[i - 1][j - 1]의 값에 따라 결정된다. 즉, DP[i][j] = DP[i - 1][j - 1] + 1;
3) DP[i][j]가 갱신될 때, 그 중 최대값이 LCS가 된다

더보기
#include <iostream>
#include <string>
#include <algorithm>
#pragma warning(disable:4996)

using namespace std;

int dp[4001][4001];
int main() {
	string str1, str2;
	cin >> str1;
	cin >> str2;

	size_t len1 = str1.length(), len2 = str2.length();

	int answer = 0;
	for (size_t i = 1; i <= len1; i++) {
		for (size_t j = 1; j <= len2; j++) {
			if (str1[i - 1] == str2[j - 1]) {
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}  
			answer = answer > dp[i][j] ? answer : dp[i][j];
		}
	}
	printf("%d", answer);
}

 

[gold5, 22252 정보 상인 호석] - 우선순위 큐 + 맵

맵에 우선순위 큐를 할당할 수 있다
 
호식이가 정보를 살 때
1) 맵의 우선순위 큐가 비어있는지 확인
2) 맵의 우선순위 큐의 크기가 b보다 작은지 확인
2-1) 만약 b보다 작다면, 우선순위 큐의 내용만큼만 정보 가치합산
2-2) b보다 크다면, b만큼만 정보 가치합산
 
2-1, 2-2 과정에서 우선순의 큐의 정보 가치를 합산한 맵을 활용하여 시간초과를 해결할 수 있다
정보들의 가치 총합의 범위가 10^6*10^6으로 10^10을 가뿐히 넘어가, long long 자료형을 사용해야 하는 것에 유의한다

더보기
#include <iostream>
#include <queue>
#include <map>
#pragma warning(disable:4996)

using namespace std;

#define ll long long
map <string, priority_queue<int>> m;
map <string, ll> s;
int main() {
	int Q, query;
	ll answer = 0;
	scanf("%d", &Q);
	for (int q = 0; q < Q; q++) {
		string name;
		cin >> query >> name;
		if (query - 1) {
			int b;
			scanf("%d", &b);
			if (m[name].empty()) continue;
			if (m[name].size() <= b) {
				answer += s[name];
				s[name] = 0;
				m[name] = priority_queue<int>();
			}
			else {
				ll cnt = 0;
				for (int i = 0; i < b; i++) {
					cnt += m[name].top(); m[name].pop();
				}
				answer += cnt;
				s[name] -= cnt;
			}
		}
		else {
			int k, C;
			scanf("%d", &k);
			for (int i = 0; i < k; i++) {
				scanf("%d", &C);
				m[name].push(C);
				s[name] += C;
			}
		}
	}
	printf("%lld", answer);
}
반응형

'문제풀이 > BAEKJOON Online Judge' 카테고리의 다른 글

[BAEKJOON] 1309  (0) 2023.09.06
[BAEKJOON] 1068, 2023, 20055  (0) 2023.09.05
[BAEKJOON] 12865  (0) 2023.09.04
[BAEKJOON] 1816, 1834, 1855, 1303, 1747, 21608  (0) 2023.09.01
[BAEKJOON] 1524, 1672, 1813, 1262, 1276, 1038  (0) 2023.08.31
Comments