본문 바로가기

Algorithm/PS

(60)
[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;..
[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..
[1일 1알고] S4 10656 십자말풀이 https://www.acmicpc.net/problem/10656 오늘은 간단한 구현 문제입니다. NxM격자가 주어지기 때문에 이차원 벡터를 사용해야겠지만 구분이 없는 문자열로 주어지기 때문에 벡터의 요소로 string을 사용하는 것으로 대신했습니다. 그리고 결과가 r, c 순서로 정렬되며 중복을 제거해야되기 때문에 set 자료형을 사용했습니다.#include #include #include #include using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector v(N); for (int i = 0; i > v[i]; } ..
[1일 1알고] G5 2011 암호코드 https://www.acmicpc.net/problem/2011 "정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다."라는 문장이 있는 것으로 보아 모든 경우를 직접 계산하는 것은 아니고, dp를 통해 계산하게 될 것임을 알 수 있습니다. 11이라면 AA 혹은 K로 해석될 수 있습니다.따라서 현재 시점에서 숫자를 따로 해석하는 경우와 합쳐서 해석하는 경우를 나눠서 보아야 합니다. 그렇다면 index i일 따로 해석하는 경우에는 i-1 시점의 경우의 수, 같이 해석하는 경우는 i-2 시점의 경우의 수와 같기 때문에전체 경우의 수 dp[i] = dp[i-1] + dp[i-2]가될 것입니다. 하지만 이것은 숫자가 따로 + 합쳐서 해석이 가능한 경우에만 그렇고 모든 경우를 따져봐야합니..
[1일 1알고] S4 27466 그래서 대회 이름 뭐로 하죠 개요https://www.acmicpc.net/problem/27466 간단한 문자열 가공 문제입니다.마지막 문자는 모음이 아니며 마지막에서 두 번째 ,세 번째 글자는 A인 문자열을 만들어야합니다. 조건에 맞게 가공 후 조건에 맞는다면 YES와 가공 문자열을, 아니라면 NO를 출력합니다. 의식의 흐름대로 코드를 만들어 인덱스가 헷갈리게 되었는데 직접 하시면 더 깔끔하게 코드를 만들 수 있을 것으로 보입니다.int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; string S; cin >> S; int len = N; int temp = N-1; reverse(..
[1일 1알고] G4 16169 수행 시간 https://www.acmicpc.net/problem/16169개요 1. 1~n개의 컴퓨터가 존재, 컴퓨터는 계급, 동작 속도를 가짐 > 0 2. ij의 전송 시간 = (i-j)^2 3. 계급은 ci, 오름 차순으로 정리한다면 |c(j)-c(j-1)| 1보다 크게 차이나지 않음 4. 최하위 계급을 제외한 컴퓨터는 한 단계 낮은 계급에게 "모두"전달받아야 동작 가능 5. 최하위 컴퓨터는 시동과 동시에 동작 6. c계급 컴퓨터가 동작을 마치면 "모든" c+1컴퓨터에 정보 전달 후 종료+ 가장 낮은 계급이 1위의 조건이 필요합니다. 처음에는 하나의 컴퓨터가 종료 후 다음 계급 컴퓨터 하나에 전달한다고 오해해 시간이 걸렸지만모두 전달받아야하며, 종료 시 모든 곳에 전..