본문 바로가기

전체 글

(90)
2024-03-16 -아기 상어(16236, 백준) BFS를 이용한 구현 문제이다. n범위가 크지 않음으로, 물고기를 잡아먹을 때 마다 층을 나누어 구해주었다. 구현이 힘든것이지 문제의 아이디어는 그렇게 높지 않다. 자잘한 실수가 나오기 쉬운 문제라고 생각한다. 더보기 #include #include #include #include using namespace std; int dx[5] = { -1, 0, 1, 0 }; int dy[5] = { 0, -1, 0, 1 }; int dis[25][25][410], ch[25][25][410]; int map[25][25], now_size[410]; int n, cnt; int ansdis = 0; struct dat { int x, y, cnt; }; queue q; void..
2024-03-15 -회문(17609, 백준) 문자 하나를 수정해서 회문을 만들 수 있다면, 이를 유사회문이라 부른다. 이때 주어진 문자열이 유사회문인지, 회문인지, 둘 다 아닌지를 판단해야 되는 문제이다. 간단하게 문자열의 앞 뒤를 투포인터로 잡아준 뒤, 검사하다가 서로 다른 문자가 나온다면, 둘중 하나의 포인터를 옮기고 check를 해준다. 이때 이미 check가 되어있다면, 2번이상 바꾸어야 함으로 유사회문이 아니게 되기때문에 break해준다. 재귀로 구현하는 편이 좋다. 하지만 나는 멍청하기 때문에 다른 문자가 나왔을때, 스킵하는 포인터의 우선순위를 왼쪽과 오른쪽을 둘다 구현해서 풀었다. 더보기 #include #include int main() { int i, j, t; scanf("%d", &t); while (..
2024-03-14 -파일 합치기(13975, 백준) 쉬운 우선순위 큐 응용 문제이다. 모든 파일들을 하나로 합칠 때의 최소 비용은 항상 가장 작은 수 둘을 합치는 과정을 반복하는 것이다. 따라서 입력받은 수를 최소 우선순위 큐에 넣은뒤, 큐에서 수가 하나남을때까지 두개를 빼서 합친뒤 다시 넣기를 반복해준다. 이 과정에서 발생하는 비용을 처리해주면 된다. 더보기 #include #include #include using namespace std; int main() { int t; scanf("%d", &t); while (t--) { int i, n; scanf("%d", &n); priority_queue pq; for (i = 0; i < n; i++) { long long x; scanf("%lld", &x); pq..
2024-03-13 -2의 멱수의 합(2410, 백준) 간단한 Dp문제였다. 2의 제곱수를 모두 구해준 뒤, 이를 이용해 수를 만들면 된다. Dp[i][j] = i개의 멱수를 사용해 j를 만들때의 경우의 수로 두고 풀었다. >점화식 0) dp[j][i] = (dp[j][i] + dp[j][i - 1]) if (j >= vec[i]) dp[j][i] = (dp[j][i] + dp[j - vec[i]][i]) 더보기 #include #include #include #include using namespace std; int n; int dp[1000010][20]; vector vec; int main() { int i, j; scanf("%d", &n); for (i = 0;; i++) { int x = pow(2, i); ..
2024-03-12 -합 분해(2225, 백준) 간단한 Dp문제였다.Dp[i][j] = j개의 수를 사용하여 수 i를 만드는 방법의 수로 정의하고 풀었다. >점화식
2024-03-11 -방배정(13304, 백준) 간단 한 문제이다. {1~2학년 남녀}, {3~4학년 남}, {3~4학년 여}, {5~6학년 남}, {5~6학년 여}그룹으로 나누어 풀면 된다. 입력 받은수가 어느 그룹에 속하는지를 확인하고 구하면 풀린다. 더보기 #include int low, mid_ma, mid_fe, high_ma, high_fe; int n, k; int main() { int i, j; scanf("%d %d", &n, &k); for (i = 0; i < n; i++) { int x, y; scanf("%d %d", &y, &x); if (1
2024-03-10 -쉬운 계단 수(10844, 백준) 간단한 Dp문제이다. Dp[i][j] = 끝이 j로끝나는 i자리 계단 수의 개수로 두고 풀었다. 해보면 기본적으로, Dp[i] = 2 * Dp[i-1]이라는 식이 쉽게 나온다. 하지만 여기서 끝이 0 혹은 9로 끝나는 경우에만 예외가 생기가 되며, 이만 잘 처리해준다면 AC를 맞을 수 있다. >점화식 dp[i][j - 1]) { dp[i][j] = dp[i - 1][j]; way[i][j] = 1; } else { dp[i][j] = dp[i][j - 1]; way[i][j] = 2; } if (s1[i] == s2[j]) { if (dp[i][j] = 0; i--) printf("%c", ans[i]); return 0; } -사전(1256, 백준) 중복 조합 문제이..
2024-03-09 -다리 놓기(1010, 백준) 왼쪽 사이트와 오른쪽 사이트사이에 다리를 겹치치 않고 지으려 했을때 가능한 방법의 수를 구하는 문제이다. 몇번 구하다보면 규칙을 발견 할 수있는데, 더 많은 오른쪽 사이트에서 왼쪽사이트를 골랐을 때, 나머지 다리가 더 적은 다리를 구할 수 있게 됨으로 조합으로 나타낼 수 있다. 결국 mCn을 구하는 문제. 더보기 #include long long dp[1010][1010]; int main() { int i, j; int t; dp[0][0] = 1; for (i = 1; i 맨앞에서부터 탐색한다. 현재 N자리값이라면 (N-1)!보다 작아질때까지 (N-1)!을 빼주며 idx를 증가시켜준뒤, 해당 자리값에 저장해 준다. ii) Query 2 -> 지금까지 쓰지않은 수중, 현재..