본문 바로가기

Algorithm

(72)
[1일 1알고] G4 2110 공유기 설치 https://www.acmicpc.net/problem/2110 N개의 집이 있고 공유기 C개를 설치해야합니다.집의 좌표가 최대 10억이고, 집의 개수가 20만 이하이기 때문에 브루트 포스 식 탐색을 하는 문제는 아닐 것입니다. 한 집에는 하나의 공유기만 설치 가능하며, 가장 인접한 공유기의 설치거리가 최대가 되는 방법이 답이 됩니다. 문제는 특정 간격 d만큼이 답이라고 가정했을 때 공유기 C개를 설치할 수 있는가? 의 물음을 이진 탐색을 통해 찾아갑니다.만약 d로 가정했을 때 C개를 모두 설치할 수 있었따면 d의 값을 늘려보고, 설치할 수 없었다면 d의 값을 줄여봅니다. 중요한 점은 이진 탐색을 할 때 기준이 이 "간격"이라는 것입니다. left = 최소 간격 = 1이 되고, (집의 위치가 모두 다르..
[1일 1알고] G5 16500 문자열 판별 https://www.acmicpc.net/problem/16500 간단한 dp문제입니다. 여느 dp문제가 그렇듯이 풀이 아이디어가 떠오르는 지에 따라 해결 시간이 많이 차이가 나는 느낌입니다. 이번 문제는 문자열 S를 단어목록 A를 통해 공백없이 붙여서 만들 수 있는지 여부를 확인하는 문제입니다. 예를 들어 S = "ABCD"이고, 주어진 A = {"A", "AB", "BCD", "ABCE"} 라면 A와 BCD를 조합해서 S를 만들 수 있고 답은 1이 됩니다. 또한 조건을 보면 S의 길이는 100이하이며, A의 문자열 개수도 100이하이고, A에 포함되는 개별 문자열의 길이도 100을 넘지 않기 때문에 시간 제한 자체는 넉넉해 보입니다.일단 완성을 해야하고, 공백없이 붙여서 만들어야하기 때문에 앞부터..
[1일 1알고] S2 2232 지뢰 https://www.acmicpc.net/problem/2232 지뢰는 연속으로 터질 수 있으며 Pi를 "초과"하는 힘을 받으면 터집니다. 따라서 저는 충격강도가 높은 지뢰는 충격강도가 낮은 지뢰로 절대 터트릴 수 없기 때문에 충격 강도가 높은 지뢰 순으로 정렬 후 인덱스를 통해 체크해보며 계산했습니다.1.#include #include #include #include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> v(N); vector mines(N); for (int i = 0; i > v[i].first; ..
[1일 1알고] S4 25288 영어 시험 https://www.acmicpc.net/problem/25288 LCS가 N이될 수 있는 경우를 모두 만족하는 가장 짧은 문자열을 구하는 문제입니다. 다만 주어진 문자에대한 모든 경우의 수를 만족해야합니다.예를 들어 abc가 주어지고 N이 3이라면 aaa, aab ,aac, aba, abb, abc, aca, acb, acc, ... 이 모두 들어가야한다는 것입니다. 이를 모두 부분수열로 가지면서 가장 짧기 위해서는 어떻게 해야할까요? 바꿔서 보면 이 문제는 중복 순열을 구하는 것과 비슷합니다.주어진 문자열의 각 문자가 중복이 가능하며 이를 N번 뽑는 것이니까요경우의 수()를 구하라고 한다면, S(문자열).size()^N이 될것입니다. 그렇다면 문자를 중복해서 뽑는 것 처럼 문자열을 중복해서 이어붙인..
[1일 1알고] B1 29732 Rick-Roll Virus https://www.acmicpc.net/problem/29732 릭롤 바이러스가 전염된 후 이를 치료할 수 있는지를 확인해야합니다. 일단 전염을 시킨 뒤 전염당한 사람의 수를 계산해 M과 비교했습니다.문자열 S에 즉시 반영시키면 결과가 오염되기 때문에 별도의 문자열 temp를 만든 뒤 이를 활용해 계산했습니다. #include #include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, K; cin >> N >> M >> K; string S, temp; cin >> S; temp = S; for (int i = 0; i = 0 ..
[1일 1알고] G5 2565 전깃줄 https://www.acmicpc.net/problem/2565 꼬여있는 전깃줄을 풀어야 하는 문제입니다.먼저 입력이 뒤죽박죽 주어지기 때문에 문제를 쉽게 풀기 위해서 A 전봇대의 높이에 따라 정렬해보았습니다. 그러고 보니 가장 적게 전깃줄을 자르는 횟수 = 가장 많은 전깃줄을 연결하는 횟수라는 생각이 들었고 A측 전봇대는 이미 정렬되었기 때문에 B에 대한 최장 증가 부분 수열(LIS)을 구하면 답이 나올 것이라고 생각했습니다.코드int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> v(N); for (int i = 0; i > v[i].first >> v[i].second;..
[알고리즘 알아보기] QuickSort 개요QuickSort는 Tony Hoare가 1959년에 고안한 알고리즘입니다.QuickSort는 대규모로 분포된 랜덤 데이터에서 MergeSort, HeapSort보다 빠를 수 있습니다. 평균적으로 O(nlogn)의 복잡도이며 최악의 경우에는 O(n^2)의 복잡도를 가집니다.Divide And Conquer(이하 D&C)를 기반으로 이루어집니다. Quicksort의 특징Quicksort는 pivot을 중심으로 두 개의 하위 배열로 분할해 다시 Quicksort를 실행하는 재귀적인 정렬을 실행합니다.그리고 재귀로 인해 쌓이는 스택메모리를 제외하면 배열 자체는 그대로 사용하기 때문에 CPU캐시 히트율이 높은 방식이라고 볼 수 있습니다. 이후 진행과정을 보면 아시겠지만 Quicksort는 불안정 정렬이기 때..
[1일 1알고] S1 10844 쉬운 계단 수 간단한 dp문제입니다.인접한 모든 자리의 차이가 1인 수가 계단 수라면 길이가 N인 숫자 중 계단 수가 몇개 존재할 수 있을지를 찾아야합니다. 현재 n의 자리에서의 수가 A라면 그 다음 자리에는 A-1과 A+1의 수만 올 수 있습니다. 만약 A가 0이라면 A+1인 1만, A가 9라면 A-1인 8만 가능할 것입니다.int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> dp(N, vector(10, 0)); long long MOD = 1'000'000'000; dp[0][0] = 0; for (int i = 1; i 결론적으로 코드는 위와 같이 됩니다.처음에는 4555..