-
[BOJ] 1019 : 책 페이지
1019 : 책 페이지 풀이 나중에 써야지~ 코드 #include <stdio.h> int N, prev; int cnt[10]; int main() { scanf("%d", &N); for (int i = 1; N; i *= 10) { int now = N % 10; N /= 10; for (int j = 0; j < now; ++j) cnt[j] += (N + 1) * i; cnt[now] += N * i + prev + 1; for (int j = now + 1; j < 10; ++j)...
-
[BOJ] 12101 : 1, 2, 3 더하기 2
12101 : 1, 2, 3 더하기 2 풀이 지금 생각해보니 스택으로 짜도 될 것 같다. 코드 #include <stdio.h> #include <vector> using namespace std; int N, K; int res; vector<int> ans; bool go(int sum, int cnt) { if (sum == N) ++res; if (res == K) return true; for (int i = 1; i <= 3; ++i) { if (sum + i <= N) { if (go(sum + i, cnt + 1)) { ans.push_back(i); return true;...
-
[BOJ] 14442 : 벽 부수고 이동하기 2
14442 : 벽 부수고 이동하기 2 풀이 dp[x][y][부순 벽의 수 k]로 두고 풀자. BFS를 돌리면 된다. 하지만 중요한 건 문제 풀이가 아니고(!) memset이 byte 단위로 초기화하기 때문에 memset(dp, 1, sizeof(dp)) 하면 dp의 각 방이 0x01010101 이렇게 채워진다는 걸 배웠다. 그래서 987654321이나 1e9처럼 int_max 절반으로 초기화하고 싶으면 0x3f로 초기화하면 된다. 음… 어셈 공부하다 말았는데 계속 해야하나? ㅠㅠ 코드 #include <stdio.h> #include <queue> #include <algorithm> using namespace std; const int dx[] = { 0,1,-1,0 }; const int...
-
[잡담] 좋은 대학이 가지는 장점은 뭐가 있을까요?
좋은 대학이 가지는 장점? #97 위 링크는 학교 질의응답 커뮤니티(아직 베타 서비스라 깃허브 이슈로 관리 중)에 올라온 질문이다. 자주 올라올 것 같은 질문이라 내 생각을 한 번 정리해서 답변해봤다. 물론 지극히 개인적인 답변 시점에서 내가 가진 생각일 뿐, 사람마다 생각이 다를 수 있고, 내 생각이 당장 5분 뒤에 변할 수도 있다. 아래는 내 답변. 좋은 대학의 기준은 사람마다 달라요. 각자 사람마다 추구하는 가치가 다르고 학교마다 추구하는 인재상이 다르기 때문이에요. 말씀하신 좋은 학교는 통상적으로 이야기하는 sky를...
-
[BOJ] 2532 : 먹이사슬
2532 : 먹이사슬 풀이 문제를 풀고 나서 다른 분들의 코드를 보다가 lower_bound를 저렇게 쓸 수 있다는 사실에 감명받았다. 양수가 음수로 변하면, 양수일 때 더 큰 수가 음수에선 더 작은 수가 되는데 양수 중에서 작은 수와 음수 중에서 가장 작은 수를 고르게 되면 넓은 범위를 찾게 된다. *lower_bound(res, res + i, now) = now;를 통해 먹이사슬인지 판단할 수 있다. 새로운 데이터가 쌓이지 못하고 덮어쓰게 되면 INF의 값이 배열의 뒤쪽에 누적되게 되고, INF의 lower_bound가 답이 된다. 코드...
-
[BOJ] 1300 : K번째 수
1300 : K번째 수 풀이 임의의 숫자 m을 골라서 K번째 숫자인지 판단해보자! 그 임의의 숫자 m은 무려 O(log K)에! 무려 이분 탐색으로 찾아보자! 그렇다면 떠오르는 질문, m 보다 작은 숫자의 개수를 어떻게 하면 빠르게 구할 수 있을까? A[i][j]에서, i행에 속한 숫자들은 i*j이므로 모두 i의 배수이다. 그러므로 min(mid/i, N)이 i번째 행에서 mid보다 작은(= 임의의 m보다 작은) 숫자들의 개수가 된다. eg. N = 1000인 경우, 첫 mid가 1000*1000/2 = 50만이 되는데, 50만/i가 N을 넘어갈 수 있으므로 min(mid/i,...
-
[잡담] ps와 cp에 대한 나의 경험과 생각
슬픈 이야기를 조금 해보려고 한다. 친구가 이런 글을 보내줬다. 그리고 그 글에는 이런 글도 링크되어 있었다. 글을 많이많이 요약하자면, Problem Solving과 Competitive Programming은 다르다. PS는 문제를 오래 고민하는 학문적인, CP는 빠른 시간안에 문제를 해결하는 경쟁적인 것. “저는 CP를 알고리즘 대회라고 보지 않습니다. 알고리즘 능력이 없으면 문제를 풀 수 없지만, 마찬가지로 코딩 능력도 같기 때문에, 결국 두 가지를 섞은 어딘가에 대회가 위치한다고 생각합니다.” 이런 내용인데 PS를 하고 있다면, 시작했다면, 시작하려고 한다면 한 번 쯤은 고민해봐도 좋을...
-
[BOJ] 14434 : 놀이기구1
14434 : 놀이기구1 풀이 머그컵 문제! parallel binary search를 사용하면 된다! 자세한 풀이는 여기에 있다. 헤헤 놀이기구2도 풀어봐야지 코드 #include <stdio.h> #include <algorithm> #include <vector> using namespace std; const int MAX = 2e5 + 3; int N, M, K, Q; int lim[MAX], ans[MAX]; vector<int> grow[MAX]; inline int get_sum(int u, int v, int k) { int ret1 = upper_bound(grow[u].begin(), grow[u].end(), k) - grow[u].begin(); int ret2 = upper_bound(grow[v].begin(), grow[v].end(), k) - grow[v].begin(); return ret1 + ret2; }...
-
[BOJ] 1162 : 도로포장
1162 : 도로포장 풀이 dp[노드번호i][포장갯수k]로 놓고 다익스트라를 돌리자! 원래 다익스트라에서 사용하던 dist[i]대신 dp[i][j]를 참조하면서 돌면 된다. now.dst는 지금까지 누적해 온 dst값이고, nxt.dst는 노드 사이의 거리(가중치)이다. 코드 #include <stdio.h> #include <algorithm> #include <queue> using namespace std; typedef long long ll; const int n_ = 10000 + 1; struct edg { int idx, dst, cnt; edg() {} edg(int idx, int dst) : idx(idx), dst(dst) {} edg(int idx, int dst, int cnt) : idx(idx), dst(dst), cnt(cnt) {} bool...
-
[BOJ] 13209 : 검역소
13209 : 검역소 풀이 이분 탐색(log n)을 돌면서 그리디(n)을 돌리면 O(n log n)에 해결할 수 있다. priority_queue를 사용하기 전에 벡터를 써서 정렬하는 생각을 먼저 했지만 코딩이 괴랄해져서 포기하고 우선순위큐를 사용했다. 바이너리 서치의 mid를 비축할 백신의 수라고 두고, 주어진 검역소만으로 mid를 충족시킬 수 있는지 그리디로 풀면 된다. 싸이클이 없고 임의의 a에서 b로 가는 경로가 단 하나이기 때문에 그리디로 풀 수 있다! dfs의 리턴값은 항상 mid를 넘지 않음이 보장된다. 물론 인구수가 mid를 넘을 수는 있다. 그건 left...