문제

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

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

풀이

기본 그래프 문제처럼 풀었다. 알고리즘 분류 및 타 블로그에는 플로이드 와샬로 많이 푼 것 같다. 

하지만 기본 DFS 그래프 탐색으로도 풀 수 있을 것 같아서 그렇게 풀었다. 이런 그래프 문제는 2차원 배열 형식으로 풀기보단 Vector를 사용하는 것이 생각하기 좀 더 수월한 것 같다. 

visited배열을 활용하여 기본 Cycle방지 + 인덱스에 값을 할당하였다.

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int N;
vector<int> map[101];
int visited[101];
void dfs(int k) {

	for (int i = 0; i < map[k].size(); i++) {
		if (visited[map[k][i]] == 0) {
			visited[map[k][i]] = 1; //다음칸
			dfs(map[k][i]);
		}
	}

}
int main() {
	cin >> N;
	
	for (int y = 0; y < N; y++) {
		for (int x = 0; x < N; x++) {
			int a;
			cin >> a;
			if(a==1)map[y].push_back(x);

		}
	}


	for (int i = 0; i < N; i++) {
		memset(visited, 0, sizeof(visited));
		dfs(i);
		
		for (int j = 0; j < N;	j++) {
			cout << visited[j] << " ";
		}
		cout << '\n';
	}

	return 0;
}

문제

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

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가

www.acmicpc.net

풀이

기본 최대 힙 구성 문제였다.

C++의 Priority_queue 를 활용하였다.

 

최소힙 문법 문제는 아래를 참고하자. 

https://trevor522.tistory.com/89

 

[백준] 최소 힙 (1927/C++)

문제 https://www.acmicpc.net/problem/1927 1927번: 최소 힙 첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면..

trevor522.tistory.com

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
priority_queue<int> pq;
vector<int> result;
int  main() {
	int N;
	cin >> N;

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		if (a == 0) {
			if (pq.empty()) {
				result.push_back(0);
			}
			else {
				result.push_back(pq.top());
				pq.pop();
			}


		}
		else {
			pq.push(a);
		}
		



	}
	for (int j = 0; j < result.size(); j++) {
		cout << result[j] << '\n';

	}



	return 0;
}

문제

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

 

1927번: 최소 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

풀이

최소힙 기본연습문제이다. 

C++ 의 Priority_queue를 활용하였다. 

최소 힙 같은경우  priority_queue<int,vector<int>,greater<int>> 를 사용하면 된다. 

 

코드

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

priority_queue<int, vector<int>, greater<>> pq;
vector<int> result;
int  main() {
	int N;
	cin >> N;

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		if (a == 0) {
			if (pq.empty()) {
				result.push_back(0);
			}
			else {
				result.push_back(pq.top());
				pq.pop();
			}


		}
		else {
			pq.push(a);
		}
		



	}
	for (int j = 0; j < result.size(); j++) {
		cout << result[j] << '\n';

	}



	return 0;
}

문제

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

풀이

기본적인 sort 정렬(2개짜리) 문제였다. 

이런 정렬 같은 경우 sort()를 활용하는 것과, priority_queue + bool operator() 활용하는 두 가지 모두 알아두자.

 

코드

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N;
vector<pair<int, int>> arr;
bool cmp(pair<int,int> a,pair<int,int> b) {
	if (a.first == b.first) {
		return a.second < b.second;
	}
	return a.first < b.first;
}

int main() {
	cin >> N;

	int x, y;
	for (int i = 0; i < N; i++) {
		cin >> x >> y;
		arr.push_back({ x,y });



	}

	sort(arr.begin(), arr.end(), cmp);

	for (int i = 0; i < N; i++) {
		cout << arr[i].first << " " << arr[i].second << '\n';

	}


	return 0;
}

'알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 최대 힙 (11279/C++)  (0) 2022.01.26
[백준] 최소 힙 (1927/C++)  (0) 2022.01.26
[백준] 덩치 (7568/C++)  (0) 2022.01.23
[백준] 수 정렬하기 3 (10989/C++)  (0) 2022.01.23
[백준] 나이순 정렬 (10814/C++)  (0) 2022.01.22

+ Recent posts