-
[BOJ] 3683 : 고양이와 개
3683 : 고양이와 개 풀이 이분그래프에서의 Maximum Independent Set(최대 독립 집합)을 구하는 문제이다. size(maximum independent set) + size(maximum matching) = size(vertices) 이거를 기억하자. 문제를 그래프화 시켜보자. 시청자를 노드, 의견 충돌을 엣지라고 두자. 시청자들은 cat을 남기고 dog를 떨어트리거나, dog를 남기고 cat을 떨어트리는 집단으로 나눌 수 있다. 그렇게 나눠서 엣지를 연결하면 이분그래프가 된다! 그런데 maximum independent set을 구하긴 힘드니까 위의 식을 정리해서, size(vertices) - size(maximum matching)를 구하자! 결국 이분매칭 문제가 되었다. 코드 #include <bits/stdc++.h> using namespace std;...
-
[BOJ] 1605 : 반복 부분문자열
1605 : 반복 부분문자열 풀이 suffix array practice 코드 #include <bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 10; int n, ans; int suf[MAXN], rev[MAXN]; char str[MAXN]; void cntsort(vector<int>& ord, int m) { int i; vector<int> cnt(m + 1, 0), tmp(n + 1); for (i = 0; i < n; i++) cnt[ord[i]]++; for (i = 1; i <= m; i++) cnt[i] += cnt[i - 1]; for (i = n; i--;) tmp[--cnt[ord[suf[i]]]] = suf[i];...
-
[BOJ] 12904 : A와 B
12904번: A와 B 풀이 직접 시뮬레이션 해보면 된다! 코드 #include <bits/stdc++.h> using namespace std; string S, T; void reverse(string K) { for (int i = 0; i < K.length(); ++i) T[K.length() - i - 1] = K[i]; } int main() { cin >> S >> T; int flag = 0; while (true) { if (S.length() == T.length()) { if (!S.compare(T)) flag = 1; break; } int len = T.length() - 1; char now = T[len];...
-
[BOJ] 12946 : 육각 보드
12946 : 육각보드 풀이 잘 생각해보면 보드는 최대 3개의 색으로 칠할 수 있다. 여기를 참고. 0과 1인 경우는 따로 처리해주고 DFS로 돌면서 이분그래프이면 답은 2, 아니면 3이다. 코드 #include <bits/stdc++.h> using namespace std; const int dx[6] = { -1,-1,0,0,1,1 }; const int dy[6] = { 0,1,-1,1,-1,0 }; int n, ans, col[51][51]; char e[51][51]; void dfs(int x, int y, int c) { col[x][y] = c; ans = max(ans, 1); for (int i = 0; i <...
-
[BOJ] 13305 : 주유소
13305 : 주유소 풀이 지금 주유소보다 더 작은 주유소가 나올 때 까지 누적하며 풀면 된다. 그리디! 코드 #include <bits/stdc++.h> using namespace std; const int n_ = 1e5 + 10; int n, i, val, dst[n_], prv = 1e9 + 10; long long ans; int main() { scanf("%d", &n); for (i = 0; i < n - 1; i++) scanf("%d", &dst[i]); for (i = 0; i < n - 1; i++) { scanf("%d", &val); prv = min(prv,...
-
[BOJ] 2531 : 회전 초밥
2531 : 회전 초밥 풀이 범위를 나타내는 left와 right를 두고 inch worm으로 계산해나가면 된다. 근데 그냥 반복문으로도 풀 수 있다. 코드 #include <stdio.h> #include <algorithm> using namespace std; int N, D, K, C; int sushi[30000 + 3000 + 3]; int cur_cnt[3000 + 3], cur_ans; void push(int sushi_num) { if (!cur_cnt[sushi_num]) ++cur_ans; ++cur_cnt[sushi_num]; } void pop(int sushi_num) { --cur_cnt[sushi_num]; if (!cur_cnt[sushi_num]) --cur_ans; } int main() { scanf("%d %d %d %d", &N, &D, &K, &C); for (int...
-
[BOJ] 13302 : 리조트
13302 : 리조트 풀이 다이나믹 프로그래밍! dp[i][j] = i번째 날에 쿠폰 개수가 j인 경우의 수! 룰루랄라 코드 #include <bits/stdc++.h> using namespace std; const int n_ = 100 + 10; const int price[] = { 0,10000,25000,37000 }; const int INF = 987654321; int n, m; int dp[n_][n_ * 2]; bool chk[n_]; void upd(int i, int j, int v) { if (dp[i][j] > v || dp[i][j] == INF) dp[i][j] = v; } int main() { scanf("%d %d",...
-
[BOJ] 1786 : 찾기
1786 : 찾기 풀이 KMP 룰루랄라 코드 #include <stdio.h> #include <vector> #include <string.h> using namespace std; const int N_ = 1e6 + 5; int fail[N_], t_len, p_len; char T[N_], P[N_]; int main() { gets_s(T); t_len = strlen(T); gets_s(P); p_len = strlen(P); for (int i = 1, j = 0; i < p_len; ++i) { while (j && P[i] != P[j]) j = fail[j - 1]; if (P[i] == P[j]) fail[i] = ++j; } vector<int> ans;...
-
[BOJ] 1701 : Cubeditor
1701 : Cubeditor 풀이 Naive한 풀이 룰루랄라 코드 #include <bits/stdc++.h> using namespace std; int ans, cnt; char str[5001]; vector<string> suf; int main() { scanf("%s", str); for (int i = 0; i < strlen(str); ++i) { suf.push_back(str + i); } sort(suf.begin(), suf.end()); for (int i = 0; i < suf.size() - 1; ++i) { while (suf[i][cnt] == suf[i + 1][cnt]) ++cnt; ans = max(ans, cnt); cnt = 0; } printf("%d", ans); return 0; } 아무말 백준,...
-
[BOJ] 7976 : 수열
7976 : 수열 풀이 좋은 풀이는 여기에 있다! 핵심은 이거: dp[i][j] = i번까지의합 % 2가 j인 최소 변환 횟수 코드 #include <stdio.h> #include <algorithm> using namespace std; int N, K; int cnt[1000001][2], dp[1000001][2]; int main() { scanf("%d %d", &N, &K); for (int i = 0; i < N; ++i) { int a; scanf("%d", &a); ++cnt[i % K + 1][a & 1]; } dp[0][1] = 1e9; for (int i = 1; i <= K; ++i) {...