백준, BOJ, 11057번, 오르막 수 : C++ [CPP] DP 중에서 하다보면 규칙을 찾는 것이다. 규칙을 2분만에 찾아서 바로 풀 수 있었다. 하지만 잘 보이지 않는다면.. 조금 힘들다. 항상 N-1과 N의 관계를 생각하면 될 것 같다. https://www.acmicpc.net/problem/11057 #맞는 풀이 #include using namespace std; int dp[1001][10]; int N; int main(){ cin >> N; //초기값 for(int i = 0; i 문제풀이(Problem Solving) 2021.12.28
백준, BOJ, 1915번, 가장 큰 정사각형 : C++ [CPP] 감이 안잡히면 가장 어려운게 DP가 아닐까.. 이것도 그렇다. https://www.acmicpc.net/problem/1915 #맞는 풀이 #include #include #include #include using namespace std; int n, m; int map[1001][1001]; int main() { cin >> n >> m; //최솟값 int ans = 0; for (int i = 0; i > s; for (int j = 0; j < m; j++) { map[i][j] = s[j] - '0'; //만약 1이 등장하면 최소 ans = 1 if (map[i][j] == 1) ans = 1; } } //1,1부터 시작하므로 나머지에 대한 계.. 문제풀이(Problem Solving) 2021.12.27
백준, 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 문제풀이(Problem Solving) 2021.12.27
백준, 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.. 문제풀이(Problem Solving) 2021.12.27
백준, 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 문제풀이(Problem Solving) 2021.12.27
백준, 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가 더.. 문제풀이(Problem Solving) 2021.12.27
벨만-포드 알고리즘, Bellman-Ford algorithm 구현하기 다익스트라가 가중치가 양수일 때만 최단거리를 찾는 알고리즘이라면 이 벨만-포드 알고리즘은 음수의 가중치도 계산한다고 보면 되겠다. 어렵지 않고.. 그냥 다익스트라를 정점개수-1만큼 돌린다고 생각하면 된다. **일반적으로 음수의 가중치는 나오지 않으나 간선을 돌아감에도 비용이 줄어든다는 것은 예를 들어 신호가 x만큼 증폭되는 증폭기가 있다고 했을 때 증폭기가 우리가 갈 노드의 수를 줄여준다고도 볼 수 있겠다. 알아보자 다익스트라가 양수가중치만 있을 때 사용하는 알고리즘이라면 벨만 포드 알고리즘은 음수 가중치가 존재해야만 의미있는 알고리즘이다. 알아보자 #include #include #include using namespace std; //간선을 표현할 Edge typedef struct Edge { in.. 문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들 2021.12.23
백준, 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.. 문제풀이(Problem Solving) 2021.12.23
백준, 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]){ .. 문제풀이(Problem Solving) 2021.12.23
백준, 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]); //방향 그래프 } //자기 자신으로 돌아오.. 문제풀이(Problem Solving) 2021.12.23