본문 바로가기

알고리즘

BOJ 백준 1932 정수 삼각형 <DP> https://www.acmicpc.net/problem/1932 7 7 3 8 10 15 8 1 0 -> 18 16 15 2 7 4 4 20 25 20 19 4 5 2 6 5 24 30 27 26 24 삼각형의 크기 n이 주어지고 삼각형의 안의 숫자가 주어진 뒤에 계단을 타고 내려오듯이 수들을 골랐을 때 그 합이 가장 큰 경우를 출력하면 된다. 위의 예시를 보면 크기 n은 5로 주어졌고 위에서부터 5줄 내려오면서 1씩 증가하면서 수가 입력되는 것을 알 수 있다. 위의 답은 7 -> 3 -> 8 -> 7 -> 5 로 30이 최대이고 이를 출력해주면 된다. 평범한 dp문제를 풀듯이, 각 줄에 내려오면서 그 줄의 최댓값들을 dp배열에 적어주면 된다. 점..
BOJ 백준 2589 보물섬 <BFS> https://www.acmicpc.net/problem/2589 이 문제는 바다와 육지가 주어지고 육지에 보물 두 개를 두었을 때 보물 두 개의 거리가 가장 멀게 배치하고 그 거리를 구해주는 문제이다. 두 보물을 배치한다곤 했지만 보물을 고려하지 않고, 두 육지의 거리가 가장 긴 경우를 출력해주기만 하면 된다. 배열을 for문으로 돌아가면서 'L', 즉 육지마다 BFS알고리즘을 이용하여 최대 거리들을 계산해주면 된다.#include #include #include #define SIZE 51 using namespace std; int xarr[4] = { 1,-1,0,0 }; int yarr[4] = { 0,0,1,-1 }; int n, m; char map[SIZE][SIZE]; in..
BOJ 백준 11055 가장 큰 증가 부분 수열 <LIS> https://www.acmicpc.net/problem/11055 가장 큰 증가 부분 수열 시간 제한메모리 제한제출정답맞은 사람정답 비율1 초256 MB98094414358746.603%문제수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출..
BOJ 백준 11053 가장 긴 증가하는 부분 수열 <LIS> https://www.acmicpc.net/problem/11053 문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출력첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.예제 입력 1 복사6 10 20 10 30 20 50 예제 출력 1 복사4 문제에 써 있는 그대로, {a1, a2, a3, .., an}의 집합이..
BOJ 백준 1699 제곱수의 합 <dp> https://www.acmicpc.net/problem/1699 이 문제는 100000 이하의 정수 하나를 입력 받아, 그 정수를 제곱수의 합으로 표현할 때, 사용되는 제곱수의 최소 개수를 출력해주는 문제이다. dp문제로, 1부터 입력받은 정수 N까지 최소 개수를 구해나가면 된다.' 1은 1^2로 1개 2는 1^2 + 1^2 로 2개 3은 1^2 + 1^2 + 1^2 로 3개 4는 2^2 로 1개 ... 이렇게 dp배열을 채워 나가, dp[N]을 출력해주면 된다. dp 배열을 채워나가는 점화식은 아래와 같다. dp[i] = min(dp[i], dp[i - 제곱수] + 1) i - 제곱수 + 제곱수 = i 이다. 예를 들어, 12는 [3 + 9] , [8 + 4] , [11 + 1] ..
콜라한캔 :: 하노이의 탑 재귀를 이용해 푸는 대표적 문제들 중 하나인 하노이의 탑은 이해하기 정말 힘든 문제였다. 하노이의 탑 문제 : https://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98_%ED%83%91 위의 그림과 같이 한 곳에 모여져 있는 원판을 아래의 조건을 지키면서 다른 기둥으로 옮기는 문제이다. 1. 한 번에 한 개씩 옮길 수 있다. 2. 자신보다 작은 원판의 위에 올라갈 수 없다. n 개의 원판을 옮기는데 필요한 최소 경우의 수는 2^n - 1개로, 만약 3개의 원판이라면 7번의 옮기는 행동을 통해 해결할 수 있다. A B C 기둥이 있고, A에서 B로 원판을 이동시키려고 한다고 해보자. A에서 B로 원판을 이동시킨다는 것은 풀어..
BOJ 백준 1238 파티 <다익스트라> https://www.acmicpc.net/problem/1238 N개의 마을에 각각 학생들이 한 명씩 있고 특정 마을에서 파티가 열린다고 했을 때, 파티장에 갔다가 다시 집으로 돌아오는 시간이 가장 긴 경우를 찾는 문제이다. 음의 가중치가 존재하지 않기 때문에 다익스트라를 이용하여 풀면 되는 문제이다. 먼저 파티가 열리는 마을을 제외하므로 N-1개의 마을에서 파티장까지의 최단 경로를 모두 구해준 뒤에 파티장으로부터 각각의 마을까지의 최단경로를 구해주면 되는, 다익스트라를 두 번 활용하면 되는 문제이다. 즉, 정리하자면 아래의 두 가지의 경로를 더해주면 특정 마을에서 파티장을 갔다오는데 걸리는 총 시간이 된다., 1. N - 1개의 마을에서 파티장까지의 최단경로 구하기 2. 파티가 열리는 마..
백준 2252 줄 세우기 <위상 정렬> https://www.acmicpc.net/problem/2252 이 문제는 위상 정렬로 푸는 문제로, STACK을 이용한 DFS 알고리즘을 통해 풀 수 있고, queue를 이용하여 degree 1차원 배열을 이용해서도 풀 수 있다. 위상 정렬에 대한 개념은, http://jason9319.tistory.com/93 > n >> m; student.resize(n + 1); for (int i = 0; i > front >> back; student[back].push_back(front); // indgree 증가 ++dg[front]; } solution(); return 0; } 2. DFS를 이용한 풀이 #include #include #include #define SIZE 32000 using ..