728x90
반응형

문제풀이(Problem Solving) 326

백준, BOJ, 1389번, 케빈 베이컨의 6단계 법칙 : C++ [CPP]

플로이드 알고리즘 적용해서 풀었다. 크리스마스 쉬고와서 그런지.. 머리가 하나도 안돌아간다. https://www.acmicpc.net/problem/1389 #맞는 풀이 #include #include #include #include #define INF 123456789 using namespace std; int cost[105][105]; int N,M; int main(){ cin >> N >> M; for(int i = 1; i from >> to; cost[from][to] = 1; cost[to][from] = 1; } //자기 자신으로 돌아오는 경로도 있어서 초기화 시켜줘야함 최단 경로 0으로 for (int i = 1; i

백준, BOJ, 2841번, 외계인의 기타 연주 : C++ [CPP]

그냥 문제 이해가 조금 어려웠다. https://www.acmicpc.net/problem/2841 #맞는 풀이 #include #include #include using namespace std; int N, P; stack vec[7]; int main(){ cin >> N >> P; int cnt = 0; for(int i = 0; i> x >> y; //먼저 누르려는 것보다 아래를 연주하려는지 확인 while(!vec[x].empty()){ //가장 위 플랫을 제거 if(vec[x].top()>y){ cnt++; vec[x].pop(); }else break; } //손을 다 뗀 후에 //이미 누른 상태면 그냥 패스 if(!vec[x].empty()){ if(vec[x].top() == y)con..

백준, BOJ, 11055번, 가장 큰 증가 부분 수열 : C++ [CPP]

물론 처음부터 생각은 안나겠지만 가장 DP다운 문제가 아닌가 싶다. 항상 N번째 항을 어떻게 구해야할까 생각하면 DP의 답은 나오지만.. 항상 생각나는 것은 아니다. https://www.acmicpc.net/problem/11055 #맞는 풀이 #include #include using namespace std; int N; int arr[1001]; int dp[1001]; int main(){ cin >> N; int ans = 0; for(int i = 1; i> arr[i]; } //dp[i] -> arr[i]를 증가 부분 수열의 마지막이라 할 때의 부분 수열의 합. //즉, 현재 위치의 값을 더한 것이 dp[i]에 저장됨 //dp[i]채우기 for(int i = 1; i

백준, BOJ, 1699번, 제곱수의 합 : C++ [CPP]

처음부터 생각하기는 힘들다. DP라는 것을 예상할 수 있지만 점화식을 바로 생각하기는 어렵다. https://www.acmicpc.net/problem/1699 #맞는 풀이 #include #include using namespace std; // 100000을 루트하면 대충 350 이하.. //또한 최소항의 수를 만들기 위해 큰 것부터 집어넣기로함, 그리드 // 그리드로 안풀림..ㅎ dp로 풀어야할 듯. int arr[100001]; int N; int main(){ cin >> N; //모든 N에 대해서 최소항의 개수를 찾아봄 for(int i = 1; i 어떤 제곱수 항을 가져야 최소 개수를 가질지 다 뒤져봄 // -> 그리디는 틀린 방식 18 = 4^2,1^2,1^2 지만 사실 3^2,3^2가 더..

벨만-포드 알고리즘, Bellman-Ford algorithm 구현하기

다익스트라가 가중치가 양수일 때만 최단거리를 찾는 알고리즘이라면 이 벨만-포드 알고리즘은 음수의 가중치도 계산한다고 보면 되겠다. 어렵지 않고.. 그냥 다익스트라를 정점개수-1만큼 돌린다고 생각하면 된다. **일반적으로 음수의 가중치는 나오지 않으나 간선을 돌아감에도 비용이 줄어든다는 것은 예를 들어 신호가 x만큼 증폭되는 증폭기가 있다고 했을 때 증폭기가 우리가 갈 노드의 수를 줄여준다고도 볼 수 있겠다. 알아보자 다익스트라가 양수가중치만 있을 때 사용하는 알고리즘이라면 벨만 포드 알고리즘은 음수 가중치가 존재해야만 의미있는 알고리즘이다. 알아보자 #include #include #include using namespace std; //간선을 표현할 Edge typedef struct Edge { in..

백준, BOJ, 1197번, 최소 스패닝 트리 : C++ [CPP] ★★★★★

실제로 MST, 최소 신장 트리를 구현하면 된다. 나는 Prim 알고리즘을 썼다. https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net #맞는 풀이 #include #include #include #define MAX 10005 using namespace std; using ti3 = tuple; int v,e; // 정점, 간선 개수 vector adj[MAX]; //인접 행렬 bool check[M..

백준, BOJ, 1922번, 네트워크 연결 : C++ [CPP] ★★★★

문제에서 모든 컴퓨터가 연결되었다. 최소비용이다를 보고 최소신장트리가 생각나면 정답이다. https://www.acmicpc.net/problem/1922 #맞는 풀이 #include #include #include #include #define MAX 1001 using namespace std; using ti3 = tuple; int n,m; vector adj[MAX]; //1000개는 인접행렬로 부담스러움(뭐 1000개까진 괜찮다 사실) //cost, to가 들어갈 예정 bool check[MAX]; //이미 이어져있는지 확인 int Prim(){ int cnt = 0; int tot = 0; priority_queue heap; //1번부터 시작함 for(auto next : adj[1]){ ..

백준, BOJ, 11403번, 플로이드 : C++ [CPP] ★★★★

플로이드 문제를 하나 더 살펴봤다 이것이 더욱 플로이드 알고리즘의 핵심인 최단거리에 가까울 것이다. 역시 노드는 100개정도로 별로 없다. https://www.acmicpc.net/problem/11404 #맞는 풀이 #include #include #define MAX 105 #define INF 123456789 using namespace std; int n, m; int path[MAX][MAX]; int main() { cin >> n >> m; //테이블 초기화(처음엔 모두 INF) (1부터 n까지) for (int i = 1; i > from >> to >> cost; path[from][to] = min(cost, path[from][to]); //방향 그래프 } //자기 자신으로 돌아오..

백준, BOJ, 11403번, 경로 찾기 : C++ [CPP] ★★★★

플로이드 알고리즘으로 해결했다. 플로이드를 조금 더 풀어봐야겠다. https://www.acmicpc.net/problem/11403 #맞는 풀이 #include #define MAX 101 using namespace std; int N; int adj[MAX][MAX]; void floyd() { //i -> j는 바로 안가도 다른 노드를 거쳐서 가도 된다. //i -> k -> j 가능 for (int k = 1; k N; for (int i = 1; i adj[i][j]; //방향 그래프임. } } floyd(); for (int i = 1; i

백준, BOJ, 1504번, 최소비용2 : C++ [CPP] ★

한 번 갔던 간선에 대해 다시 갈 수 있으므로 연결해줄 때 양방향으로 연결해줘야 했다. 남들은 잘보이지만 나는 이것만 30분 넘게.. 걸렸다. 그리고 어차피 최단경로 = 최단경로 + 최단경로라고 생각해도 된다. https://www.acmicpc.net/problem/1504 #맞는 풀이 #include #include #include #include #include #include #define MAX 803 #define INF INT_MAX using namespace std; int N, E; vector adj[MAX]; //인접행렬 long long dist[MAX]; long long dist1[MAX]; //v1을 위한 long long dist2[MAX]; //v2를 위한 int v1, ..

728x90
반응형