본문 바로가기

ALGORITHM

(45)
[C++/2887] 행성 터널 - using MST : Kruskal Algorithm 문제 아이디어: 최소 비용으로 그래프를 완성하는 전형적인 MST 문제이다. Kruskal 알고리즘을 사용하였다. 여기서 중요한 점은 간선 정보를 입력받은 후, 간선의 비용은 직접 abs와 min으로 직접 구해야한다는 것이다. 풀이: #include #include #include #include using namespace std; int parent[100000]; int findParent(int x) { return (parent[x] == x ? x : parent[x] = findParent(parent[x])); } void unionParent(int a, int b) { a = findParent(a); b = findParent(b); if (a < b) parent[b] = a; els..
[C++/16234] 인구 이동 - using BFS 문제 아이디어: BFS 연합 정보를 기록하는 vector를 만들어서 인구 수 차이가 연합을 생성할 수 있다면 vector에 좌표를 추가하고 마지막에 인구 수를 나눠서 저장한다. // 동 서 남 북 int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; int L, R; void process(vector &v, vector &unions, int x, int y, int index) { // 연결된 연합 도시 정보 vector united; united.push_back({x, y}); // BFS queue queue q; q.push({x, y}); unions[x][y] = index; int sum = v[x][y]; // 인구 수 총합 int count ..
[C++/3190] 뱀 - Implementation 문제 아이디어: 좌표를 저장하는 vector를 만들고, 사과가 없는 경우 꼬리를 자르기 위한 vector를 따로 만들어서 관리한다. #include #include #include using namespace std; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; int main() { // N(보드 크기), K(사과 수), L(뱀 회전 수) int N, K, L; int result = 0; cin>>N; vector v(N, vector(N, 0)); cin>>K; for(int i = 0;i >a>>b; v[a - 1][b - 1] = 1; } vector snake; cin>>L; for(int i = ..
[C++/18405] 경쟁적 전염 - using BFS 문제 아이디어: BFS 바이러스의 위치 좌표를 queue에 넣어서 이를 확인하며 바이러스가 진행할 수 있는 칸의 값을 바꾸며 탐색을 진행한다. #include #include #include using namespace std; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; int main() { // N(시험관 크기), K(바이러스 종류) int N, K; cin>>N>>K; vector v(200, vector(200, 0)); vector virus[1001]; for(int i = 0;i >temp; v[i][j] = temp; if (temp != 0) ..
[C++/2606] 바이러스 - using BFS 문제 그래프가 주어질 때 0번 노드와 몇개의 서로 다른 노드가 연결되어 있는지 반환하는 문제이다. 쉬움 아주 간단하게 BFS를 바로 쓸 수 있다. 노드에 대해서 for문 돌지 않고 바로 0번 노드 한번만 BFS를 돌면 된다. #include #include #include using namespace std; int main() { // N(컴퓨터 수), M(edge 수) int N, M, result = 0; cin>>N>>M; vector v(N, vector(N, 0));// 그래프 생성 vector visited(N, false);// 방문 기록 for(int i = 0;i >x>>y; // 0번 부터 M-1번으로 변경 // 양방향 그래프를 만들어준다...
[C++/LeetCode] Is Graph Bipartite? - using BFS Daily LeetCoding Challenge for April, Day 29. 문제: 이분 그래프(Bipartite Graph) 판단하기 이분 그래프 Bipartite Graph node들을 두개의 집합으로 구분할 수 있고, 같은 집합에 속한 node끼리는 연결되지 않아야 한다. 즉 다시 말해서 3색 칠하기와 같은 문제라고 볼 수 있다. 연결되어 있는 노드끼리는 같은 색이 되지 않도록 색칠하는 문제와 같다. 아이디어: BFS (or DFS) BFS를 사용하여 그래프를 전체 탐색하여 연결되어 있는 노드가 같은 색인 경우 false를 return 하면 된다. 완성 class Solution { public: void BFS(vector &color, vector graph, int root, int c,..
[C++/1012] 유기농 배추 - using DFS 문제 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 아이디어: DFS DFS로 1이 붙어있는 곳은 다 방문하고 결과를 + 1한다. 그 다음 방문하지 않았고, 1인 공간에 대해서 DFS를 반복하면 총 몇개의 분리된 공간이 나오는지 확인할 수 있다. 완성 #include #include using namespace std; int M, N; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; void DFS(vector &v, vector &visited, int i, int j..
[C++/2178] 미로 탐색 - using BFS BOJ 2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net #include #include #include using namespace std; int N, M; // 동 서 남 북 int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; void BFS(vector &v, vector &visited, int i, int j) { queue q; q.push({i, j}); visited[i][j] = true; while(q.empty() == false) { auto temp = q.fron..