본문 바로가기

Algorithm/백준

[백준] 3078번: 좋은 친구

https://www.acmicpc.net/problem/3078

 

3078번: 좋은 친구

문제 상근이는 환갑을 바라보던 나이에 수능 시험을 다시보고 교대에 입학했고, 초등학교 선생님으로 취직했다. 상근: 요즘 애들은 친구를 사귀지 않나봐. 내가 앞에서 보고 있으면, 친구가 있는 학생이 별로 없는 것 같아. ??: 오빠! 오빠는 말콤의 친구와 성적이라는 책 안 읽어 봤어? 이 책에는 성적과 친구가 무슨 관계가 있는지 나와. 요즘 애들은 친구를 사귀기 전에 먼저 그 친구의 반 등수를 살펴봐. 말콤은 이 연구를 하기 위해서 6년동안 초등학교에서 선

www.acmicpc.net

큐 연습문제. 풀이를 보고 구현했다.

그냥 배열로 풀면 시간복잡도가 O(N^2)이 되는데 N이 300,000 이하이므로.. 배열로는 풀면 안될 것 같은 예감이 바로 든다(실제로 배열로 풀면 시간초과가 뜸)

 

이 문제를 풀기 위해 이름 길이별로 큐를 만든다. (큐에 저장되는 정보는 학생의 인덱스(등수)이다.)

그리고 각 학생을 입력받을 때마다 이름 길이에 해당하는 큐를 탐색한다.

인덱스의 차이가 k보다 큰 학생들을 모두 pop한 뒤에,

남아있는 큐의 원소 개수를 카운트하고 새로 입력된 학생의 인덱스를 push하면 된다.

 

#include <iostream>
#include <string>
#include <queue>

using namespace std;

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

	int n, k;
	queue<int> q[21];
	long long cnt = 0;

	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		string input;
		cin >> input;

		int len = input.length();

		while (!q[len].empty() && i - q[len].front() > k) {
			q[len].pop();
		}
		cnt += q[len].size();
		q[len].push(i);
	}

	cout << cnt;
}

 

정답코드

'Algorithm > 백준' 카테고리의 다른 글

[백준] 1918번: 후위 표기식  (0) 2020.03.19
[백준] 5430번: AC  (0) 2020.03.19
[백준] 10993번: 별 찍기 - 18  (0) 2020.03.15
[백준] 3190번: 뱀  (0) 2020.03.12
[백준] 5397번: 키로거  (0) 2020.03.12