본문 바로가기

알고리즘/백준 문제풀기

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] ..
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 ..
BOJ 백준 1753 최단경로 https://www.acmicpc.net/problem/1753 이 문제의 입력은 총 정점의 수와 간선의 수, 시작할 정점과 각 간선들에 대한 정보가 주어진다. 간선의 방향이 존재하며, 시작 정점으로부터 다른 모든 정점들에 대해 최단 경로를 출력해주어야 한다. 다익스트라 문제는 종종 풀었으나, 우선순위 큐를 이용하여 푼 적은 거의 없었다. 이 문제도 보자마자 다익스트라를 사용했고, 결과는 시간 초과였다. 메모리 제한 : 256MB시간 제한 : 1초 우선 정점의 수가 최대 20000개이므로 일반 배열, 즉 20000 * 20000의 int형 배열로는 메모리 초과가 난다. 그래서 vector을 이용하여, 간선의 정보가 주어지면 push해주는 방법을 이용했다. 난 단순히 메모리초과만 생각하고 벡터로 한 뒤 ..
BOJ 백준 2644 촌수계산 https://www.acmicpc.net/problem/2644 말 그대로 촌수 계산을 해 주는 문제이다. 입력값으로는 1. 사람의 수2. 촌수를 계산하려는 두 사람3. 부모-자식 관계의 수 4. 부모-자식 관계 이렇게 들어온다. 문제에서 원하는 것은 2번에 입력된 두 사람의 촌수를 출력해주는 것이다. 촌수를 계산하려는 두 사람의 공통되면서 최소인 부모노드를 찾고 찾아낸 부모노드로부터 촌수를 계산해주면 되는, 어렵지 않은 문제이다. vector을 이용해서 두 사람의 부모노드들을 찾아 저장해주고, 비교해주면서 최소 부모 노드를 찾아내는 형태로 풀었으나, 사실 추가 배열 없이 parent[]라는 배열 하나로 문제 풀이가 가능하다. #include #include #define SIZE 101 using n..