백준 문제풀이

8/29 ~ 9/4 PS + 매우 짧은 SUAPC 후기

Vermeil 2022. 9. 5. 02:07

 최근들어 제대로 된 PS를 하기로 했다. 그냥 무지성으로 웰논 골플 문제를 푸는 것이 아닌, 깊은 생각을 요하는 문제를 풀어야겠다...

 

BOJ 18287 - 체스판 이동 (P2)

더보기

 행렬식 dp문제다. 홀수 행렬과 짝수 행렬을 곱해준 행렬을 N제곱하면, 2N번 이동했을 떄의 경우의 수가 된다. 여기에서 \(2k+1\)꼴로 이동하기 위해서는, k제곱한 행렬에 홀수 행렬을 곱해주면 된다.

 

 

BOJ 24894 - 내적 (P1)

더보기

식을 잘 건드리면 \(\frac{y_i}{x_i}\)에 대한 cht를 할 수 있다.

 

 

BOJ 10847 - 자카르타의 마천루 (D4)

더보기

 그냥 다익스트라 돌리면 된다. 다만 b+kp (k는 자연수)에 동일한 p값을 가진 도게가 있다면 이보다 더 큰 b + (k+1)p부터는 볼 필요가 없다. b - kp에서도 동일.

 

 

BOJ 1533 - 길의 개수 (P3)

더보기

 한 정점을 5개로 쪼개고, a5 -> a4 -> a3 -> a2 -> a1 처럼 거리 1의 단방향 간선을 만들어주자. b to a의 거리가 4라면, b1 -> a4에 거리 1 간선을 추가해주면, b1 to a1의 거리는 4가 된다. 이제 행렬 거듭제곱을 해주면 끝이다.

 

 

BOJ 17033 - Cow Land (P1)

더보기

 무지성으로 골플 안 풀기로 했는데 무지성 hld가 여기에 있었네..

 

 

BOJ 3903 - 제주도 (D4)

더보기

 Half Plane Intersection을 배우고 풀은 문제인데... 일단 풀이는.. 각 변을 벡터로 보고, r만큼 안쪽으로 평행이동 했을 때의 반평면 교집합이 존재하는지를 알 수 있다. 그리고 이 r은 이분 탐색으로 찾으면 되므로, 시간복잡도는 \(O(NlgNlgX)\)가 된다. \(X\)는 좌표의 범위다.

 

 

BOJ 25364 - Job Lookup (P4)

더보기

 \(dp[l][r]\) = (구간 \([l, r]\)에서의 최솟값) 으로 정의 하자. 구간을 어떤 인덱스 i에서 끊는 경우에는 \([l,i-1]\)과 \([i+1,r]\)로 나뉘게 된다. 이때 구간 내의 수들과, 구간 밖의 수들에서 각각 하나씩 뽑아, 이 두 정점의 cost를 dp에 다 더해줄 것이다. 행렬이 이미 주어졌으므로 2차원 누적합을 사용하면 빠르다.

 

 

BOJ 8907 - 네온 사인 (P4)

더보기

 불가능한 경우를 생각해보자. 삼각형의 두 변은 색이 같고, 나머지 한 변은 다른 두 변과 다른 색이다. 이는 삼각형에서 두 변의 색이 다른 경우는 2가지임을 뜻한다. 즉, 지금 보고 있는 정점 u와 연결된 모든 간선을 확인했을 때, 각 색의 개수를 a, b라고 하자. 정점 u가 포함되는 '불가능한 삼각형'의 개수는 당연히 a * b다.

이들의 합을 2로 나눈 값을, nC3에서 빼주면 끝이다.

 

 

BOJ 1763 - 트리 색칠 (D2)

더보기

 깊은 관찰이 필요했다. 어떤 정점을 부모 정점에 합치는 것을 생각해보자. 가중치가 최대인 정점을 먼저 부모로 합쳐주는 것은 적어도 손해는 아니다. 즉, 이러한 정점을 부모로 바로 합쳐주는 답이 존재하므로, 꼭 루트에서부터 내려오며 처리하지 않아도 된다. 이제 그룹 \(i\)와 그룹 \(j\)의 부모 그룹을 \(p\)라고 해보자. 그리고 \(f_k=(그룹 k까지 색칠한 횟수)\)라고 하자. \(i\)를 먼저 부모에 합치고, 다음에 \(j\)를 부모에 합친다면, 비용은 \(c_{i}f_{p} + c_{j}(f_{p}+f_{i})\)가 된다. 이 반대는, \(c_{j}f_{p} + c_{i}(f_{p}+f_{j})\)가 되는데, 식을 정리하면 \(c_i / f_i\)가 큰 것부터 합치는 것이 이득임을 알 수 있다. 어떤 그룹 i가 담당하는 \(c_i\)와 \(f_i\)를 부모 그룹과 union-find를 이용하여 합치면 된다. \(O(N^2)\)에 구현해도 충분히 AC받는다. 우선순위 큐 등을 사용하여 \(O(NlogN)\)으로 줄일 수 있다.

 

 

BOJ 13448 - SW 역량 테스트 (P3)

더보기

 위 문제처럼 exchange argument를 이용해보자. 문제 i를 풀고 다음에 j를 푸는 경우, \(M_i - R_{i}P_i + M_j - (R_i+R_j)P_j\)점을 얻는다. 점수를 최대한 많이 얻어야 하므로, 식을 정리하면 \(R_i / P_i\)가 작은 것부터 푸는 것이 이득임을 알 수 있다. 이것을 정렬한 상태에서, 냅색을 해주면 된다. \(O(NT)\)

 

 

BOJ 24396 - 푸앙이와 별 (P5)

더보기

 잘린 간선을 최대한 이용해보자. 큐에 들어있는 정점들에서 어떤 정점 v로 갈 수 없는 경우는, v에서 큐에 들어있는 정점들로 가는 '불가능한 간선'의 개수가 queue_size와 동일할 때이다. v로 가는 것이 가능하다면 새로운 큐에 넣어주고, 이 새로운 큐에서 bfs를 이어서 돌려주면 된다.

 

 

 

 suapc는 그냥 멱살잡히고 끌려갔다.

 

 코드포스 때문에 이건가 싶으면 무지성으로 구현하는 습관이 생겨버린 것 같다. 부계로 해서 좀 생각하는 코포를 해야겠다....

'백준 문제풀이' 카테고리의 다른 글

9/12 ~ 9/18 PS (+ 앳코더 민트)  (0) 2022.09.19
9/5 ~ 9/11 PS  (0) 2022.09.11
8/23 ~ 8/28 PS  (0) 2022.08.29
8/15 ~ 8/20 PS (1000 Solve)  (8) 2022.08.20
8/8 ~ 8/14 PS  (0) 2022.08.14