본문 바로가기

Algorithm/PS

(61)
[1일 1알고] G4 11054 가장 긴 바이토닉 부분 수열 https://www.acmicpc.net/problem/11054 이 문제는 LIS문제에서 조금만 더 생각해보면 쉽게 해결할 수 있습니다. https://basaeng.tistory.com/118 [1일 1알고] G5 2565 전깃줄https://www.acmicpc.net/problem/2565 꼬여있는 전깃줄을 풀어야 하는 문제입니다.먼저 입력이 뒤죽박죽 주어지기 때문에 문제를 쉽게 풀기 위해서 A 전봇대의 높이에 따라 정렬해보았습니다. 그러고 보basaeng.tistory.com위의 문제는 LIS문제였습니다.바이토닉 부분 수열이란 어떤 수 Sk를 기준으로 S1 2 k-1 k > Sk+1 > ... SN-1 > SN을 만족 하는 수입니다. 결론적으로 Sk를 기준으로 좌측에서는 증가 부분 수열, 우측..
[1일 1알고] G5 5175 문제없는 문제 https://www.acmicpc.net/problem/5175 해당 문제는 간단한 dfs, 백트래킹 문제입니다.N,M이 20이하로 굉장히 작은 범위이며, 정답을 찾기 위해서는 모든 조합을 탐색해야하기 때문에 조합을 탐색하는 방법을 그대로 사용하면 됩니다. 조합으로 표현하면 (N)C(1~N)을 모두 경우의 수로 하여 이 중 M을 충족하는 지 확인해야합니다. 일반적으로 생각해보면 bool vector혹은 array를 통해 모든 알고리즘을 사용하는지 확인하며 백트래킹 할 수 있겠지만위에서 말한 것 처럼 N과 M의 범위가 매우 작기 때문에 bool vector 대신 비트마스킹을 사용해볼 수 있습니다. 예를 들어 알고리즘 1과 2를 사용한다면 11, 1과 3을 사용한다면 101과 같이 저장하면 됩니다.최대 ..
[1일 1알고] G4 9207 페그 솔리테어 https://www.acmicpc.net/problem/9207 문제와 조건을 이해하면 간단하게 해결할 수 있는 문제입니다. 다만 저는 문제 이해에 시간이 오래걸렸네요" 현재 게임판에 꽂혀있는 핀의 상태가 주어진다. 이때, 핀을 적절히 움직여서 게임판에 남아있는 핀의 개수를 최소로 하려고 한다. 또, 그렇게 남기기 위해 필요한 최소 이동횟수를 구하는 프로그램을 작성하시오." 이 말에서 핀을 적절히 움직이라는 것이 전체 보드 내에서 핀을 자유롭게 배치하라는 말인 줄 알았는데, 초기 핀은 고정이고 말그대로 "적절히" 움직이라는 것이었습니다 ㅎㅎ... 보드의 크기가 세로 r = 5, 가로 c = 9로 고정이기 때문에 dfs, 백트래킹을 통해 조건에 맞게 탐색하면 답은 간단히 나옵니다.#include #inc..
[1일 1알고] G5 16494 가장 큰 값 https://www.acmicpc.net/problem/16494 dp혹은 브루트포스를 사용해 풀 수 있는 문제입니다. 개인적으로는 dp를 생각하고 풀어 G5가 왜이렇게 어렵지 라고 생각했는데dfs를 활용해 간단하게 해결도 가능한 문제였네요.문제는 N개로 이루어진 수열을 M개의 그룹으로 나누었을 때 속한 수의 최댓값을 구하는 것입니다. 연속된 수가 최댓값이 되게 해야하는데 예를 들어 10, -4, 5이 있을 때 그룹이 1개라면 최댓값은 3개를 한번에 묶은 11, 그룹이 2개라면 10, 5를 각각 그룹으로 한 15가 됩니다. 이러한 상황을 고려하기 위해서는, 현재 수를 고르지 않는 경우, 현재 수가 이전값과 이어져 한 그룹인 경우, 현재 수가 새로운 그룹의 시작점인 경우, 이렇게 나눌 수 있습니다.혹은 ..
[1일 1알고] S3 3100 국기 인식 https://www.acmicpc.net/problem/3100 6*9크기의 배열을 삼등분된 국기로 만드는 문제입니다. 가로 세로를 나눠서 계산해야하나, 그런데 중간은 달라야하니 어떻게 계산해야하나 여러 고민을 했었는데 실제로는 배열의 크기가 6*9이고 가능한 색(알파벳)의 종류가 등분에 따라 중복을 포함해도 26*26*26이기 때문에 얼마 되지 않스빈다. 결론적으로 브루트 포스로 푸는 것이 가장 간단한 풀이였네요 #include #include #include #include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); vector v(6); for (int i = 0..
[1일 1알고] G5 2294 동전 2 https://www.acmicpc.net/problem/2294 가장 기본적인 DP문제입니다.예전에는 아이디어가 전혀 떠오르지 않았는데 이제는 생각나는게 신기하네요 n가지 동전을 통해 k원을 만드는 문제입니다.배낭문제와 비슷하지만 해당 동전 문제는 같은 동전을 중복해서 사용할 수 있다는 차이점이 있습니다. 평범한 배낭 문제에서는 중복을 피하기 위해 뒤에서 앞으로 탐색했지만 동전 문제는 중복이 가능하기 때문에 앞에서 뒤로 탐색하는 것이 더 간편한 방법입니다.#include #include #include #include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, ..
[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을 넘지 않기 때문에 시간 제한 자체는 넉넉해 보입니다.일단 완성을 해야하고, 공백없이 붙여서 만들어야하기 때문에 앞부터..