본문 바로가기

Algorithm

(6)
JOI 2018 풀이 2월 5일 08시부터 12시까지 JOI 2018 셋을 돌았다. 그런데 운이 좋게도 11시 27분에 올솔브를 하게 되어, 남은 30분 가량의 시간 동안은 풀이를 쓰면서 푼 문제들을 정리해 보고자 한다. 참고로 3번은 정해가 아닌데 뚫은 거일 가능성이 높으며, 시간복잡도 증명도 제대로 하지 않았으니 정확한 풀이를 원하는 사람은 믿지 않도록 한다. 1번: Stove 각 사람 $i(1\leq i\leq N-1)$가 방문할 때마다 난로를 1초 동안은 켜야 하므로, 적어도 1의 비용이 소모된다. 여기서 i+1번 사람이 방문할 때까지 난로를 켜 놓는지, 1초 후에 끄는지에 따라 비용이 달라진다. 전자의 경우에는 총 비용이 $T_{i+1}-T_i$이므로, 추가적으로 비용 $T_{i+1}-T_i-1$이 소모된다. 그런데..
BOJ 17441번: 파리채 만들기 미적분학에 나오는 Green의 정리에 대해 학습한 후, 이를 사용하는 알고리즘 문제가 있다고 해서 찾아서 풀어보았다. Green의 정리를 제대로 이해하고 있다면, 그걸 모르는 사람에게도 설명할 수 있어야 하므로, 독자가 Green의 정리를 모른다고 가정하고 글을 써보기로 했다. 문제 내용과 계산식 다각형 모양의 영역 R에 두 점 $P(x_1, y_1), Q(x_2, y_2)$가 있을 때, $PQ^2$의 기댓값을 구하는 문제이다. 연속적인 점의 위치에 대한 기댓값이므로 구하는 기댓값 E는 다음과 같이 적분으로 표현된다. 여기서 $dA_1=dx_1dy_1, dA_2=dx_2dy_2$ 이다. $$E=\left ( \iiiint_{P, Q\in R} dA_1 dA_2 \right )^{-1}\times\iiii..
BOJ 30513번: 하이퍼 삼각형 자르기 SASA Programming Contest 2023 Div. 1 (Arena #11)을 쳤다. 원래는 학교 작은 실험실 일정과 겹치고 아레나가 참가 범위가 아니어서 치지 않으려고 했다. 그러나 작은 실험실 행사가 예상보다 일찍 끝났는데 백준을 열어보니 대회창에 진행중인 대회가 보여서 갑자기 치고 싶어져서 쳤다. 15시~18시에 한 대회인데, 사실상 15시 20분에 문제풀이를 시작했다. 늦게 시작했고 아레나 참가범위가 아니어서 성적이 아무 의미 없으니, 재미로 어려운 문제들부터, 즉 H번(A번에서 N, Q 제한이 바뀐 조건)부터 B번까지의 역순으로 풀기로 했다. E번까지 풀고 나니 17시 25분 정도였고, 부모님께 전달받을 물건이 있어서 빨리 내려갔다 오니 17시 35분이었다. B, C, D는 쉬우므로 ..
BOJ 15507번: 연산 최적화 개요 - 알고리즘 분류: KMP, BFS - 문제에 대한 평가: 아이디어가 기발함. 함수를 단순화해서 문제를 해결하는 것에 대한 시사점을 제공함. 문제 요약 0과 1로만 이루어진 길이 N의 문자열 S가 있다. 연산 F는 다음의 세 연산으로만 이루어진다. A: 끝에 0 추가, B: 끝에 1 추가, C: 앞의 문자열을 한번 더 복사 A, B, C의 합성으로 이루어진 함수 F에 대해, F(F(O)) = S인 F가 존재하는지 판별하고, 존재한다면 이중 합성횟수가 가장 작은 것의 횟수를 구하라. 단, O는 빈 문자열이다. 문제 풀이 과정 문자열에 대해 여러 가지를 시도해 보았으나 잘 안 되었다. 그래서 가장 원초적인 것부터 하기로 했다. 문자열의 길이만 따지는 것이다. 길이가 X인 문자열에 A, B, C를 적용하..
BOJ 18193번: 비행기 타고 가요 개요 - 알고리즘 분류: Dijkstra, Merge Sort Tree, Segment Tree Lazy Propagation - 문제에 대한 평가: 2차원을 관리하는 효과적인 자료구조에 대한 시사점을 제공함. 아이디어가 기발함. 구현이 상당히 많음. 문제 요약 N개의 정점이 있는 그래프에서 간선 M개가 다음과 같이 주어진다. (cost, s1, s2, e1, e2): 모든 s1 이상 s2 이하의 정점에서 모든 e1 이상 e2 이하의 정점으로 가는 가중치 cost의 간선이 있다. V에서 각 정점까지의 최단 거리를 구하라. 문제 풀이 과정 먼저, s1을 인덱스로 삼고 s2에 대해 정렬하는 Merge Sort Tree를 만든다. Dijkstra를 수행하되, 티켓을 정점으로 생각한다. 이때 (e1, e2)로 ..
PS에 사용되는 C++ 기능 정리 C++의 Standard Template Library에는 C언어보다 훨씬 많은 함수와 기능들이 있기 때문에, 이들을 모두 익히는 것은 불가능하다. 하지만 PS에 사용되는 함수와 자료구조들은 굉장히 한정적이다. 이에 이들을 간략히 정리하고자 한다. 다른 사람들도 볼 수 있게 해서 문제를 풀다가 필요한 기능에 해당하는 C++ 함수를 찾아볼 수 있도록 하고, 나도 가끔씩 C++의 함수가 헷갈리기 때문에 정리해 두고 참고용으로 사용하기 위함이다. 나는 C++ 언어 자체는 깊게 모르고, PS에 사용되는 기법들만 익히는 정도이기 때문에, 이론적인 내용에는 오류가 있을 수 있으며 오류를 발견하면 댓글로 달아주면 감사하겠다. iterator 객체지향형 프로그래밍 언어인 C++의 가장 큰 특징은 class와 templ..