본문 바로가기

분류 전체보기91

[대학생 수학경시대회] 2016년 제1분야 4번/제2분야 5번 연속함수 \( f : \left[ -{\pi \over 4}, {\pi \over 4} \right] \rightarrow \left[ -1, 1 \right] \)가 구간 \( \left(-{\pi \over 4}, {\pi \over 4} \right) \)에서 미분가능할 때, 다음 부등식을 만족하는 점 \( x_0 \)가 구간 \( \left(-{\pi \over 4}, {\pi \over 4} \right) \)에 존재함을 보여라. $$ \left| f'(x_0) \right| \leq 1 + f(x_0)^2 $$ Sol) 먼저 함수는 단조증가함수 또는 단조감소함수가 아니라면 \( f'(x_0) = 0 \)을 만족하는 점이 적어도 하나는 존재하게 된다. 그리고 이 점에 대해 부등식이 자동으로 성립.. 2022. 9. 14.
[C++] Disjoint Set 기초 구현 이건 솔직히 너무 쉬워서 뭐 설명할 게 없음 class DisjointSet { std::vector parent; public: explicit DisjointSet(int n); int get_parent(int idx); bool join(int i, int j); bool _joined_(int i, int j); }; DisjointSet::DisjointSet(int n) : parent(n) { for (int i = 0; i < n; ++i) { parent[i] = i; } } int DisjointSet::get_parent(int idx) { if (idx == parent[idx]) { return idx; } return parent[idx] = get_parent(parent[i.. 2022. 9. 9.
SUAPC 2022 Summer, 신촌지역 대학생 프로그래밍 대회 동아리 연합 여름 대회 Open Contest 참가 후기 최종 결과 : 6솔 (그리고 6솔 중에서 순위 가장 낮음) B번 내비게이션 : 그냥 함수 구현 문제다. std::abs 쓰면 됨. 0:11 B Accepted F번 차의 개수 : 구성적 문제다. 그냥 등비수열이랑 등차수열 출력하면 됨... 0:18 F Accepted C번 패스 : 이것도 구성적 문제다. 간단한 관찰을 통해, 홀수일 때는 항상 불가능하다는 사실을 알 수 있다. 공이 항상 첫 패스한 사람에게 돌아오기 때문. 근데 짝수일 때가 문제였다. 나는 간단한 관찰을 통해 n이 2^k 꼴일 때 2^k부터 1까지 역순으로 출력하면 그게 언제나 답이 된다는 사실을 알았다. 그리고 증명은 안 했지만 "이런 문제는 왠지 곱산술 성질을 가지고 있을 것 같음"이라는 생각을 했다. 그러니까 n=p일 때 참이고 n=.. 2022. 9. 6.
[백준 22357] 경품 추첨 (UCPC 2021 예선) (Platinum IV) https://www.acmicpc.net/problem/22357 22357번: 경품 추첨 UCPC가 작년에 이어 올해도 온라인으로 열리는 것이 아쉬웠던 청한이는 평행우주를 뒤져서 평소처럼 모두가 한 곳에 모여 대회를 치르는 세계를 찾아냈다. 청한이는 이 세계의 시상식에서 성대 www.acmicpc.net 출력할 수 있는 수의 제한이 500만 이하로 매우 작다는 것에 주목, 번호들을 최대한 구겨넣어서 생성하는 방법을 생각해 보자. 예컨대 K = 2, N = 5라면 다음과 같이 2~26까지의 수를 모두 생성하는 것이 가능하다. 1 6 11 16 21 1 2 7 12 17 22 2 3 8 13 18 23 3 4 9 14 19 24 4 5 10 15 20 25 5 6 11 16 21 26 따라서 등차수열을 .. 2022. 9. 5.
[대학생 수학경시대회] 2020년 제1/2분야 4번 4. 다음 극한값을 구하여라. $$ \lim_{n \rightarrow \infty} \int_0^{\pi \over 2} {{\cos^2 x} \over {1 + \cos^2 nx}} dx $$ Sol) 먼저, 대칭성에 의해 주어진 식이 $$ {{1} \over {2}} \lim_{n \rightarrow \infty} \int_0^{\pi} {{\cos^2 x} \over {1 + \cos^2 nx}} dx $$ 와 같음을 관찰한다. 복소수 \( x \)에 대해 $$ \cos^2 x = {1 \over 4} \left( e^{2ix} + e^{-2ix} + 2 \right) $$ 이므로, \( z = e^{2ix} \)로 치환하면 $$ {{1} \over {2}} \int_0^{\pi} {{\cos^.. 2022. 9. 3.
[대학생 수학경시대회] 2021년 제2분야 7번 7. 실수 \(a, b\)에 대하여 행렬 \(A\)를 다음과 같이 정의하자. $$ A = \begin{pmatrix} a & 1 & 1 & 1 \\ 1 & b & 1 & 1 \\ 1 & 1 & a & 1 \\ 1 & 1 & 1 & b \end{pmatrix} $$ 이때 행렬 \(A\)가 양의 정부호(positive definite)일 필요충분조건은 \(a > 1\)이고 \(b > 1\)임을 보여라. Sol) \( (\Leftarrow) \) 행렬 \(J\)를 모든 성분이 \(1\)인 \(4 \times 4\) 행렬이라 하고, 대각행렬 \( D \)를 \( D = A - J \)라 하자. 그러면 \( D \)는 모든 대각성분이 양수인 대각행렬이므로 자명히 양의 정부호이고, 행렬 \(J\)는 대각화하여 $$.. 2022. 9. 2.
[백준 25384] 니은숲 예술가 (Diamond V) https://www.acmicpc.net/problem/25384 25384번: 니은숲 예술가 만들 수 있는 조형물의 가짓수를 $998\, 244\, 353$$(=119\times 2^{23}+1)$으로 나눈 나머지를 출력한다. $998\, 244\, 353$은 소수이다. www.acmicpc.net 조형물의 상태로 가능한 것을 아무거나 하나 그려 보았다. 그림과 같이, 네 면 중 인접한 두 면에는 가장 마지막 조각만이 있고, 나머지 두 면에는 연속된 여러 개의 조각들이 나타난다. 따라서 부분 문제를 다음과 같이 정의할 수 있겠다. - \( DP(n, i, j) \) : 네 면 중 두 면에 n번째 조각이 나타나고, 한 면에 i~n번째 조각이, 한 면에 j~n번째 조각이 나타남. n = 4, (조각) =.. 2022. 8. 31.
[대학생 수학경시대회] 2015년 제2분야 8번 임의의 i, j에 대해, 행렬 \( X \)와, \( X \)와 관련 없는 임의의 행렬 \( A \)에 대해 $$ {\partial \over \partial x_{ij}} X = E_{ij}, {\partial \over \partial x_{ij}} A = O $$ 이다. 여기서 \( E_{ij} \)는 (i, j)-성분만 1이고 나머지 성분은 0인 행렬이고, \( O \)는 영행렬이다. 따라서 곱의 미분법에 의해 $$ O = {\partial \over \partial x_{ij}} I = {\partial \over \partial x_{ij}} XY = E_{ij} Y + X {\partial \over \partial x_{ij}} Y $$ 로부터 $$ {\partial \over \parti.. 2022. 8. 29.
[대학생 수학경시대회] 2014년 제1분야 8번 8. 양의 무리수 \( \alpha \)에 대하여 수열 \( \left\{ q_n \right\}_{n \geq 1} \)을 $$ q_n = {[n \alpha] \over n} $$ 로 정의하면 수열 \( \left\{ q_n \right\}_{n \geq 1} \) 은 단조증가수열이 아님을 보여라. Sol) 일반성을 잃지 않고 \( 0 2022. 8. 29.
[대학생 수학경시대회] 2017년 제1분야 6번 주어진 조건만으로 생각보다 A에 대해 많은 것을 알 수 있는 문제입니다... 2022. 8. 29.
[대학생 수학경시대회] 2019년 제2분야 7번 7. 벡터 \( v_1, v_2, v_3, v_4 \)는 길이가 각각 2, 3, 4, 5이며 서로 수직이다. 임의의 2차원 부분공간 \( W \subset \mathbb{R}^4 \)에 대하여 \( v_1, v_2, v_3, v_4 \)를 \( W \)에 정사영하여 얻은 벡터들 가운데 적어도 하나는 길이가 1이 아님을 보여라. Sol) 일반성을 잃지 않고 \( v_1 = 2e_1, v_2 = 3e_2, v_3 = 4e_3, v_4 = 5e_4 \)라 하자. 그리고 선형사상 T를 Tv = (v의 W 위로의 정사영)으로 잡는다. 이제 네 정사영의 길이가 모두 1이라 가정하면 $$ \left\langle e_1, Te_1 \right\rangle = {1 \over 4}, \left\langle e_2, Te.. 2022. 8. 28.
[대학생 수학경시대회] 2021년 제2분야 6번 대한수학회에서 공식 제공하는 대학생 수학경시대회의 해설은 깔끔한 풀이보다는 색다른 풀이를 선호하는 경우가 많다. 그래서 여러 가지 방법으로 풀 수 있는 문제들에 대해서는 여러 풀이를 알아두는 것이 좋다. '행렬의 고유벡터는 그 행렬을 설명하는 특성 중 하나다'를 잘 나타내주는 문제라고 생각한다. 2022. 8. 28.
[백준 5615] 아파트 임대 (Feat. 밀러-라빈 소수 판정법) (Platinum I) https://www.acmicpc.net/problem/5615 5615번: 아파트 임대 첫째 줄에 아파트의 면적의 수 N이 주어진다. 다음 줄부터 N개 줄에 카탈로그에 적혀있는 순서대로 면적이 주어진다. N은 100,000이하이고 면적은 231-1이하인 양의 정수이다. www.acmicpc.net 매우 자명한 어떤 절차에 의해, 2N + 1이 소수가 되는 N을 찾는 문제임을 알 수 있다. Naive한 소수 판별을 짜면 시간복잡도 \(O(T \sqrt{N})\)이 나와서 TLE가 난다. 시간복잡도를 줄일 수 있는 방법으로 밀러-라빈 소수 판정법을 이용하자. a = 2, 7, 61에 대하여 \( n - 1 = 2^s d \)로 놓는다. \( a^d \ne 1 \mod n \)이고, 모든 r : 0 ~ s.. 2022. 8. 28.
[백준 9206] 나무 말고 꽃 (Platinum II) https://www.acmicpc.net/problem/9206 9206번: 나무 말고 꽃 선영이와 남자친구의 2주년이 얼마 남지 않았다. 선영이는 그를 위해 특별한 것을 사주려고 한다. 남자친구는 나무에 관심이 매우 많다. 하지만, 선영이는 나무는 선물로 매우 크다고 생각한다. www.acmicpc.net 수치해석 문제들이 다 그렇듯이 수많은 시도를 해야 풀 수 있다... 일단 constexpr로 각종 상수를 정의해 주자. constexpr value들은 컴파일 시점에 평가되기 때문에, #define 같은 매크로의 기능을 거의 모두 쓸 수 있으면서 그것보다 더 안전하다고 할 수 있겠다. constexpr long double PI = 3.1415926535897932384626l; constexpr .. 2022. 8. 26.
C++로 문서 작성 프로그램 만들기 - 1. 클래스 다이어그램 짜기 [객체 지향 프로그래밍 프로젝트 가이드] Motivation 객체 지향 프로그래밍 과제 프로젝트라 함은 무언가 엄청난 발명을 해서 실용적인 것을 추구하기보다는, 객체 지향 프로그래밍을 잘 이해할 목적으로 만들어지는 것이다. 그러므로 기본적으로 주제 선정에 있어서 4 Pillars of OOP를 마음에 새기는 것이 중요하다. 캡슐화(Encapsulation) 상속(Inheritance) 추상화(Abstraction) 다형성(Polymorphism) 개인적으로 나는 Polymorphism을 써서 만들 수 있는 프로그램이 뭐가 있을지 떠올리는 게 가장 힘들었다. 그러다가, "print() 멤버 함수로 문자열도 출력하고 표도 출력하고 그래프도 출력하는 프로그램이 있으면 재미있지 않을까?"라는 생각이 갑자기 들어서, 그때부터 보고서 작성 프로그램의 기획.. 2022. 8. 26.
C++ Dynamic Programming 꿀팁 다음과 같이 코드를 짜면, memoization DP를 전역 변수 없이, 불필요하게 많은 함수 인자 없이 안전하게 짤 수 있다. #include int main() { std::vector memo(100, std::optional()); std::function fibonacci = [&fibonacci, &memo](uint32_t i) -> int { if (memo[i].has_value()) { return memo[i].value(); } return i 2022. 8. 23.
[백준 18222] 투에-모스 문자열 (Silver II) 5줄 안으로 구현하기 https://www.acmicpc.net/problem/18222 18222번: 투에-모스 문자열 0과 1로 이루어진 길이가 무한한 문자열 X가 있다. 이 문자열은 다음과 같은 과정으로 만들어진다. X는 맨 처음에 "0"으로 시작한다. X에서 0을 1로, 1을 0으로 뒤바꾼 문자열 X'을 만든다. X의 뒤에 www.acmicpc.net 문제에서는 숫자를 1부터 세지만 우리는 편의상 숫자를 0부터 세도록 하자. 임의의 자연수 n에 대해, n의 2진수 표현에서 비트 값을 (아무 위치에서나) 1만큼 바꿔 준 수 m을 고려하자. 그러면 n번째 투에-모스 문자열과 m번째 투에-모스 문자열 값은 그 parity가 반대임을 알 수 있다. 따라서 n의 2진수 표현의 비트 수를 세 준 뒤 2로 나눈 나머지를 출력하기만.. 2022. 8. 20.
[백준 25323] 수 정렬하기, 근데 이제 제곱수를 곁들인 [UCPC 2022 예선] (Platinum V) https://www.acmicpc.net/problem/25323 25323번: 수 정렬하기, 근데 이제 제곱수를 곁들인 양의 정수로 이루어진 길이가 $N$ 인 수열 $A_1,A_2,\cdots ,A_N$이 존재할 때, 다음 행동을 원하는 만큼 반복할 수 있다. $1\leq i,j\leq N;i\neq j$이면서 $A_i\times A_j$가 제곱수인 $i$, $j$를 선택해, $A_i$와 $A_j$ www.acmicpc.net AB가 제곱수이고, AC가 제곱수이면 BC도 제곱수이다. 증명 : (A^2)BC가 제곱수고, 제곱수를 제곱수로 나누면 제곱수라는 사실로부터 자명하다. 반대로 AB가 제곱수이고, AC가 제곱수가 아니면, BC도 제곱수가 아니다. (증명은 위와 똑같이 하면 된다) -> 수열이 몇 .. 2022. 8. 20.
[백준 1168] 요세푸스 문제 2 (Platinum III) (Feat. PBDS) - 세그먼트 트리 없이 풀기 https://www.acmicpc.net/problem/1168 1168번: 요세푸스 문제 2 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 100,000) www.acmicpc.net 컴퓨터공학과에서 를 수강한 학생들이라면 std::set이 레드-블랙 트리로 구현되어 있다는 것을 알 것이다. 레드-블랙 트리는 Binary Search Tree다. 즉 원소들이 나름의 순서를 갖추고 정렬되어 있다는 것이다. 정렬되어 있다는 것은, 마치 Binary Search 하듯이 k번째 원소를 O(logn) 안에 접근할 수 있음을 함의한다. 그러나 그것을 하기 위해서는 rb-tree의 각 노드들이 subtree의 개수를 저장하고 있어야 한다. std::set은 이 기능을 제공하.. 2022. 8. 17.
[C++] Segment Tree 라이브러리 만들기 Segment Tree는 PS에서 정말 자주 사용되는 자료구조 중 하나다. 그러나 Segment Tree에 들어갈 타입도 int, long long, derived-type 등 제각각, 연산도 add, multiply, min, max 등 제각각이므로 그냥 Generic programming으로 클래스 하나를 만들었다. 이 Segment Tree는 타입 T와 함수객체 BinaryOP를 받는다. T에 타입 넣고 BinaryOP에 인자 2개 받는 operator() 정의하면 끝. /* * Segment-tree! */ template class Segment_tree { std::vector tree; int size; public: explicit Segment_tree(const std::vector &.. 2022. 8. 16.
C++로 문서 작성 프로그램 만들기 [객체 지향 프로그래밍 과제 가이드] 많은 대학에서 객체 지향 프로그래밍을 가르칠 때 프로젝트를 시킨다. 그러나 16주라는 짧은 기간 안에 4 Pillars of OOP도 끝까지 가르치기는 힘들다. 교수님이 잘못하셨다는 게 아니라, 원래 4 Pillars of OOP에 익숙해지는 과정에서 신문법을 다수 익혀야 하다 보니... 그래서 신문법 배우기에 바빠 설계법까지 미처 배울 시간이 없는 경우가 종종 있다. 그래서, 내가 본 어떤 프로젝트에서는 '여자' 클래스를 만든 뒤 '여자' 클래스를 상속받는 '사람' 클래스를 만들기도 하더라. 그래서 훗날 객체 지향 프로그래밍 과제를 하게 될 불쌍한 사람들을 위해 이 게시글을 쓰게 되었다. 프로그램의 소스 코드 길이는 과제를 마친 2022년 6월 19일 기준으로 2280줄이다. 그 중 약 200줄 정도가.. 2022. 8. 15.
유용한 비트 연산들 출처 : , 안티 라크소넨 x | (1 2022. 8. 11.
[C++] 볼록 껍질 클래스 구현 임의의 개수의 2차원 점을 input으로 받아, 볼록 껍질 객체를 만들어 주는 클래스이다. using namespace std; class Point { public: long long x, y; Point(long long _x, long long _y) : x(_x), y(_y) {} Point operator-(const Point& rhs) const { return Point(x - rhs.x, y - rhs.y); } bool operator x * rhs.y) { return false; } else { return x * x + y * y < rhs.x * rhs.x + rhs.y * rhs.y; } } bool operator==(const Point& rhs) const { return.. 2022. 8. 7.
[C++] 다항식 클래스와 라그랑주 보간법(Lagrange Interpolation) 구현 다음 문제를 풀다가 다이나믹 프로그래밍으로 푸는 법이 생각이 안 나서 Lagrange Interpolation으로 밀어붙이려고 했다. 사실 생긴 것만 봐도 다이나믹 어쩌고저쩌고보다는 수학 문제를 닮아 있는 것 같지 않은가? 사실 이 문제에 대한 일반화는 이미 존재하고, 베르누이 수열인가 뭔가를 쓴다고 알고 있지만 그걸 굳이 알고 싶지는 않았다. 그리고 도전 중인 문제가 하나 더 있는데 그 문제에서도 Lagrange Interpolation을 쓰기 때문에 어차피 한 번은 이걸 구현해야 해서, 그냥 오늘 구현하기로 했다. 특이사항으로, class Polynomial을 구현할 때 std::vector를 쓰지 않았다. C++의 이동 연산에 대해 공부하고 있었기 때문에 이동 연산을 구현해야 했기 때문이다. 시간복.. 2022. 8. 7.
[C++] SCC Maker class 타잔 알고리즘으로 SCC를 만들어주는 클래스. 설명은 나중에 적어야지... class SCCMaker { public: std::vector adj; std::vector id; int next_id; std::stack s; std::vector is_in_scc; std::vector scc; SCCMaker(std::vector &vvi) : id(vvi.size(), -1), next_id(0), is_in_scc(vvi.size(), false) { adj.swap(vvi); for (int i = 0; i < adj.size(); ++i) { if (id[i] == -1) { id[i] = next_id++; dfs(i); } } std::sort(scc.begin(), scc.end(), [.. 2022. 8. 6.
[백준 18542] Permutant (Ruby III) 풀이 https://www.acmicpc.net/problem/18542 18542번: Permutant Consider an \(n \times n\) matrix \(A\). Let us denote element in \(i\)-th row and \(j\)-th column as \(A_j^{(i)}\). You are given a sequence \(a_1, \dots , a_n\) and a permutation \(π_1, \dots , π_n\) such that the first row is formed by sequence \(a_k www.acmicpc.net 먼저 주어진 Permutation는 Linear Transform의 일종임을 파악해야 한다. 예를 들어, Permutation {.. 2022. 8. 4.
[C++] 선분 교차 판정 선분 교차 판정이란 말 그대로 두 선분이 교차하는지 아닌지 판정하는 것이다. 선분 교차 판정을 효율적으로 하기 위해서는 CCW(또는 signed area)에 대한 지식이 필요하다. CCW(또는 signed area)란? 세 점 A, B, C에 대하여 선분 BC가 AB에 대하여 시계 방향으로 휘어져 있는지 반시계 방향으로 휘어져 있는지 판정하는 것으로, 2차원에서 determinant의 개념을 응용하는 기술이다. 두 2차원 벡터 u, v의 determinant는 2가지 정보를 담고 있다. 그 절댓값은 두 벡터 u, v가 생성하는 평행사변형의 넓이를 알려주고, 그 부호는 v가 u에 대하여 시계 방향으로 휘어져 있는지 반시계 방향으로 휘어져 있는지를 알려준다(+: 반시계, -: 시계). PS계에서는 CCW라는.. 2022. 8. 4.
[C++] 유리수 클래스(class Fraction) 구현 프로그래밍을 할 때 실수를 쓸 일이 있으면 대부분 double을 사용하지만 PS계에서는 스페셜 저지가 붙어 있지 않은 한 이런 행위는 죄악에 가깝다. 대표적인 예시가 바로 4225번. square-root를 다루는 주제에 스페셜 저지도 안 붙어 있어서, 입력값이 10000 이하임에도 불구하고 int128을 써야 하는 괴상한 문제다. 어쨌든 높은 정밀도를 위해서는, long double에 안주하지 말고 더 정확한 값을 얻을 수 있는 방법이 무엇일지를 생각해 놓아야 한다. 오차는 계산할 때마다 계속해서 불어나는 성질이 있다. 2.5를 반올림해서 3으로 표현한다면, 2.5 * 2.5는 실제로는 6.25지만 데이터 상으로는 3 * 3 해서 9가 되는 것이다. double을 쓰면 어쩔 수 없이 오차가 있을 수밖에.. 2022. 8. 4.
[C++] AVL Tree와 이를 이용한 Ordered-Set 구현 C++을 컴파일할 때 G++ 컴파일러를 쓰는 사람은 PBDS(Policy-Based Data Structure)라고 해서 유용한 연산들을 많이 제공해 주는 자료 구조를 쓸 수 있다. 하지만 난 Xcode를 쓰기 때문에 PBDS를 못 쓴다! 그래서 그냥 내가 만들기로 했다. 밑의 코드는 AVL Tree를 통해 Ordered-Set을 구현한 것이다. Ordered-Set이란? 기존의 Balanced Binary Search Tree 기반의 Set에 몇몇 기능을 추가한 것이다. 주요 기능으로 다음 두 가지 기능이 있다. find-by-order : Set의 n번째 원소가 무엇인지를 O(log n) 안에 찾아준다. order-of-key : Set의 원소 k가 몇 번째로 작은 원소인지를 O(log n) 안에 찾.. 2022. 8. 4.
[C++] class Modulo: 나머지환에서의 사칙연산을 구현해 보자 설명은 나중에 써야겠다. template class Modulo { private: long long n; public: Modulo() = default; constexpr Modulo(long long _n) : n(_n >= 0 ? _n % P : (P - (-_n % P)) % P) {} constexpr Modulo operator+(const Modulo& rhs) const {return Modulo((n + rhs.n) % P);} constexpr Modulo& operator+=(const Modulo& rhs) {*this = *this + rhs; return *this;} constexpr Modulo operator-() const {return n == 0 ? Modulo(0).. 2022. 8. 4.