복기 : 처음엔 각 수비수를 중점으로 한 d개의 정사각형의 꼭짓점과 중점을 O1과 Oi와의 ccw 결과를 판단하는 풀이로 시도했으나 실패. O1과 Oi과 중점이 직선상에 있지만 O1과 Oi을 잇는 선분이 직사각형을 지나지 않는 TC가 반례가 된다.
그래서 각 정사각형을 이루는 선분을 모두 저장해서, 각 공격수가 정사각형 내에 있지 않고 공격수를 잇는 선분이 정사각형의 선분과 교차하지 않는지 판단하는 풀이로 AC를 받았다.
그런데 1틀만 하면 될 것을 무려 6틀이나 했는데, case #1:처럼 #을 넣어서 틀리던지, TC 번호를 나타내는 t를 증가시키지 않고 continue 한다던지... 너무 멍청하게 틀려버렸다. 이런 실수 줄여야 하는데, 빨리 끝내려고 다급하게 풀다보니 이렇게 된 것 같다. 다음부터 신중하게 문제를 읽고 풀어야겠다.
복기 : 주어진 범위의 수들은 소인수 개수가 많지가 않아서 모두 소인수 분해를 해놓고, 뒤 인덱스부터 제곱으로 검사하고, 약수들마다 카운트해주는 방식을 사용하면 된다.
검사는 Ap×Aq의 소인수들로 필요한 소인수들을 채워주고 남은 소인수들을 전부 채워줄 수 있는 수를 찾으면 된다.
복기 : 누가 봐도 dp긴 한데, DFA를 자세히 보지 않고 혼자 Top-Down DP 짜면서 뻘짓하다가 실패했다 ㅠ...
그런데 DFA 그림을 dp 식으로 나타내는 발상 자체가 어려운 것 같다. 하지만 눈치채면 구현은 쉬운 그런 느낌. 문제에서 힌트를 주면 조금 더 자세히 보는 습관을 들여야겠다.
복기 : N3을 최소한 N2logN으로 줄여야 할 것 같다. 그러면 벡터 같은 것을 정렬해서 조합론을 이용해 한 번에 계산해야 할 것 같은데... 이를 생각해내지 못해 실패했다.
그래서 풀이를 찾아봤는데 무슨 말인지 도통 이해가 안간다. 일단 나의 접근법의 방향 자체는 맞는 것 같다. 다음에 제대로 풀어봐야겠다.
복기 : 처음엔 그냥 정렬로 접근하다가 쉽게 반례를 찾았다. 생각을 계속 해봤는데, 맨 앞에서부터 동일한 문자가 없으면 끊긴다(?) 트라이를 만들어서 각 노드마다 접근할 때 카운트를 해준다. 그리고 모든 문자열을 넣고 루트에서부터 dfs를 시작한다. 카운트 나누기 K가 1 이상이면 그 문자까지 집합을 카운트 나누기 K만큼 집합을 이룰 수 있다는 말이 된다.
이런 느낌으로 접근해서 AC를 받았다. 그런데 사실 풀이를 쓸 엄두가 나지 않는다. 어떻게 설명해야 할지 감이 안오네🤔
복기 : 제곱근 분할법으로 접근했는데 TLE를 받는다. 좀 더 빠르게 할 방법이 도저히 떠오르질 않았다. 알고리즘 태그 까보니깐 비트 집합...? bitset을 이용하는 문제 같다. 주 언어가 Python이라 bitset을 잘 모른다...; 다음에 공부해서 다시 풀어봐야겠다.
복기 : 대충 리프가 4개 이상인 서브 연결 그래프가 있는지 찾는 문제 같다. 맞나...? 문제에서의 몸통을 어떻게 처리?해야 할지 감이 안와서 dfs로 여러 방법을 시도하다가 결국 실패했다.
사실 문제 지문이 많이 별로인 것 같다. 번역도 그렇고 처음에 몸통이 정확하게 무엇인지 전혀 이해가 가지 않았다. 지문 자체가 모호한 이런 문제는 진짜 별로다.
복기 : n이 작은 케이스에서 일일이 계산해보니깐, i×j=n과 gcd(i,j)=1을 만족하는 i, j를 찾으면 되는 것 같았다. 그래서 2≤i≤⌊n⌋ 범위에서 i, j를 찾아, p×i+q×j=n−1을 만족하는 p, q를 찾으면 100000이 넘지 않게 출력하는 식으로 AC를 받았다.
사실 증명하고 푼게 아니라서 풀이를 바로 올리려니 쉽지 않다. 나중에 에디토리얼 보면서 다시 배우고 풀이 올려야겠다.
복기 : 좌표로 생각해서 (xi,yi) 순으로 내림차순 정렬해서 훑어보면, 계산되는 직사각형의 x 좌표는 xi로 고정되고 y 좌표는 지금까지 나온 yj(1≤j<i) 좌표 중 최댓값과 yi의 최솟값이 됨을 알 수 있다. 단 이 문제에서 가로 세로를 회전할 수 있는데, 이는 그냥 회전한 좌표와 인덱스를 같이 넣고, 겹치지 않는 인덱스가 있는지 같이 확인하면서 계산하면 된다.
사실 위와 같은 풀이를 실패하고 깨달았다. 계산되는 직사각형의 한 좌표는 고정됨을 생각해내지 못해 실패했다.
복기 : 각 정점을 네 방향으로 쪼개서 BFS를 진행 및 역추적하는 문제. 사실 문제 알고리즘 자체는 어렵지 않으나, 구현이 상당히 헷갈리는 문제다. 오늘 10시간 운전하고 문제 풀다보니깐, 방향을 넘겨받을 때 너무 헷갈려서 실패할까봐 초조했다. 다행히 AC를 받았다.😉
복기 : 일단 이 문제를 만든 분께 경의를 표한다. 진짜 아이디어 미쳤다... i번 정점에 대해, (현재 탐색한 모든 정점 수 tot) = (i번 정점과 연결된, 탐색한 정점 수 connecti) + (i번 정점과 연결되지 않은, 탐색한 정점 수 disconnecti)로 나타낼 수 있다. 이 문제는 끊긴 간선이 주어지므로, 그 간선들을 해시 맵과 같은 자료구조로 나타내자. 그리고 tot, disconnecti를 관리함과 동시에 tot=disconnecti를 만족하는 i번 정점을 찾자. 만족하는 i번 정점에 대해, 탐색한 정점이 있다는 뜻이므로 i번 정점으로 BFS 진행이 가능하게 된다는 뜻이다. 진짜 어려운 문제 같다.
복기 : 정다각형에서는 모든 꼭짓점을 지나는 외접원을 찾을 수 있다. 그러므로 세 점의 외심을 찾고, 외심과 세 점이 이루는 각도를 찾는다. 그리고 R의 점의 개수는 최대 1000이므로 브루트포스로 찾는다.
위 풀이가 내가 생각한 풀이다. 그런데 외심을 구할 때, ZeroDivision을 어떻게 처리해야 할지 생각이 나지 않아 실패했다. 일단 내가 생각한 풀이는 맞으려나...?