본문 바로가기

PS - 알고리즘

(48)
10479 - 따르릉 따르릉 step 1더보기맥스를 반지름이 0.5인 원으로 생각하면 조금 복잡합니다. 사람을 점으로 표현할 수 있는 방법이 없을까요?맥스의 중심을 기준으로 자동차의 빨간 원 안에 들어가면 차와 충돌하게 됩니다. 차 부분만 확대하면 다음과 같습니다.0.5만큼 살찌웠다고 생각하면 됩니다. 그럼 맥스에 해당하는 점이 자동차 주위 빨간 영역과 겹치는지 확인하면 됩니다.step 2더보기지금부터 자동차를 고정시킬 것입니다.맥스는 위로 M의 속도로, 차는 오른쪽으로 B의 속도로 달립니다.그럼 이건 차가 고정되어 있고 맥스가 위로 M, 왼쪽으로 B의 속도로 달리는 것과 같습니다. 맥스는 t초 뒤에 출발합니다. 그 말은 맥스가 처음 위치에서 Bt미터 왼쪽에서 출발한다는 것과 같습니다. 그럼 자동차 입장에서 맥스가 어떻게 움직이는지..
1314 - 동굴 탐험 step 1더보기$N+1$개의 비트로 이루어진 2진수를 생각합니다. $i$번째 비트가 0이면 i번째 사람이 왼쪽에 있다는 뜻이고 1이면 오른쪽에 있다는 뜻입니다. $N+1$번째 비트는 지도의 위치입니다. 0이면 지도가 왼쪽, 1이면 오른쪽에 있다는 뜻입니다.step 2더보기$N$개의 비트로 이루어진 또 다른 2진수를 생각합니다. 자신에 해당하는 비트가 1인 사람들이 함께 움직입니다. $1010_{(2)}$면 2, 4번 사람이 함께 움직입니다.믿을 수 있는 사람이 없다거나 무게가 넘어서 건널 수 없는 경우가 있습니다. 1부터 $2^N-1$까지 모든 경우에 대해 이동이 되는지 안되는지 구해 둡니다.step 3더보기처음 생각한 $N+1$개의 비트로 이루어진 2진수를 정점으로 생각합니다. 이동이 가능한지, 그때..
31725 - 포닉스와 달구 step 1더보기$dp[i][j]$ : i, j 칸을 지날 때 얻을 수 있는 가장 큰 점수 이 dp값을 구해봅시다. 이걸 구하기 위해 2개의 dp를 만들겠습니다.$dp_s[i][j]$ : 시작점에서 i, j까지 올 때 얻을 수 있는 가장 큰 점수$dp_e[i][j]$ : i, j에서 끝점까지 갈 때 얻을 수 있는 가장 큰 점수 $dp_s[i][j] = max ( dp_s[i-1][j], dp_s[i][j-1] )  + A_{i,j}$$dp_e[i][j] = max ( dp_e[i+1][j], dp_e[i][j+1] )  + A_{i,j}$로 구할 수 있습니다. 그럼 $dp[i][j] = dp_s[i][j]+dp_e[i][j]-A_{i,j}$입니다. $dp[i][j]$는 i, j가 아래 그림의 빨간 칸일 ..
2969 - 메뚜기 step 1더보기꽃잎이 많은 꽃은 절대 적은 꽃으로 이동할 수 없습니다. 그럼 꽃잎 수로 정렬을 한 다음 자기보다 더 많은 꽃만 고려해도 문제를 해결할 수 있습니다. 꽃잎 수로 정렬한 다음 문제를 해결합니다.step 2더보기dp[i][j] : i,j에 있는 꽃에 있을 때 이동할 수 있는 최대 횟수 이 dp를 어떻게든 구하면 이 문제를 해결할 수 있습니다.아래 그림에서 검은 칸에 메뚜기가 있다고 해봅시다. 이 칸에서의 dp값은 {빨간 칸에 있는 dp값의 최대값 + 1}입니다. 그럼 새로운 dp를 정의해 봅시다. Ldp[i][j] : i,j 포함 자기 왼쪽에 있는 모든 dp값들의 최댓값 이 dp를 왼쪽, 오른쪽, 위쪽, 아래쪽 모두 만들면 이 문제를 해결할 수 있습니다. 이것은 펜윅트리로 만들 수 있습니다...
16324 - Jumbled String 문제 번역더보기subsequence :  문자열에서 일부 문자 하위 집합을 제거하여 얻은 문자열(ex. string에서 sing, i, sg 등)0과 1로 이루어진 비어있지 않은 문자열을 만들고 싶습니다. 이때, 문자열에서 subsequence가00인 것들의 개수, 01인 것들의 개수, 10인 것들의 개수, 11인 것들의 개수가 각각 $a$, $b$, $c$, $d$였으면 합니다. 이런 조건을 만족하는 문자열을 만드세요.step 1더보기$a$를 통해서 0의 개수를 알아낼 수 있습니다.$\frac{n(n-1)}{2} = a$인 $n$이 0의 개수입니다.같은 방법으로 1의 개수 역시 $d$를 통해 찾을 수 있습니다.이렇게 찾은 0, 1의 개수를 각각 $n$, $m$이라고 합시다.step 2더보기어떤 1을 잡..
14207 - 약수 도로 step 1더보기모든 도시를 정점으로, 도시 간 이동을 간선으로 표현하면 쉽게 문제를 풀수 있습니다. 물론 시간과 공간만 충분하다면 말이죠. 조금 더 표율적으로 하기 위해 정점 $X$ 를 $X$의 배수인 모든 정점을 하나로 뭉쳐 놓은 것이라 생각할 수 있습니다.step 2더보기답이 0이나 1인 경우는 너무 쉬우니 생략하겠습니다. 아래 예시는 예제 입력 4를 기준으로 하고 있습니다.정점들을 모두 표시한 다음 시작 점을 포함하는 출발 정점들을 표시해 봅시다. 마찬가지로 도착 정점도 표시해 줍니다. 도착 정점 $X$와 출발 정점 $Y$가 있을 때 $LCM(x,y) \le N$ 이면 $X$에서 $Y$로 가중치 0인 간선을 만들어 줍니다. 아래는 간선의 일부만 만들었습니다. 이제 BFS를 돌리면 답을 알 수 있습..
21034 - Go To Goal 문제 번역더보기0번 칸부터 $ 2N + M$번 칸까지 $2N + M + 1$개의 칸이 있는 게임 판이 있습니다. 당신은 0번 칸에 있고 특수 카드 $N$장과 일반 카드 $M$장을 가지고 있습니다. 특수 카드를 사용하면 2칸을, 일반 카드를 사용하면 1칸을 갈 수 있습니다. 이때, 특수 카드는 연속해서 3번 사용할 수 없습니다. 마지막 칸에 도착할 수 있는 경우의 수를 구하세요.step 1더보기$N$과 $M$이 작으면 dp로 해결할 수 있습니다. 하지만 그러기에는 드가 너무 많죠. 결국 경우의 수를 구하는 문제니 수학으로 접근해 봅시다.0부터 시작하는 카운트가 하나 있다 생각해 봅시다. 특수 카드를 쓰면 카운트가 1 증가하고 일반 카드를 쓰면 카운트가 0으로 초기화 됩니다. 카운트가 2를 넘지 않도록 모든..
22204 - Tiny - 4 문제 번역더보기테트리스에서 몇가지 조건이 변경되었습니다.1. 게임 판은 9*9입니다.2. 블럭은 회전이 불가능하고 떨어지는 동안 움직일 수 없습니다.3. 블럭은 9 종류가 있습니다.4. 블럭이 떨어지는 순서가 있을 때 모든 블럭을 다 떨어트려야 합니다.step 1더보기이 문제는 지금까지의 문제와 결이 살짝 다릅니다. 게임 판이 주어졌을 때 해당 게임 판이 얼마나 좋은지 점수를 매겨봅시다. 이 점수가 좋은 쪽을 따라가다 보면 게임을 끝낼 수 있습니다.step 2더보기3가지 기준을 세웁니다.1. 비어있는 가로줄 당 20점2. 블럭을 놓았을 때 제거되는 가로줄 당 90점3. 빈칸 위에 블럭이 있는 경우 블럭 개수 당 -5점 앞으로 올 4개의 블럭을 놓을 수 있는 경우의 수는 $9^4$입니다. 모든 경우에 대해..
4544 - 'Roid Rage 문제 번역더보기더보기$M$개의 다각형이 있습니다. 각 다각형끼리 교차하는지 아닌지 판단하세요. 두 개의 다각형이 내부 영역을 공유하거나(즉, 겹치는 경우) 경계점을 공유하는 경우(즉, 한 점이나 가장자리를 따라 닿는 경우)를 말합니다.step 1더보기더보기다각형의 수와 꼭짓점의 수가 적기 때문에 모든 경우를 보는 방법으로도 충분히 풀 수 있어 보입니다. 두 다각형이 있을 때, 어떤 변이 교차하면 반드시 겹친다고 할 수 있습니다. 이는 CCW를 이용해서 해결할 수 있습니다.두 직선 $\overline{XY}$랑 $\overline{ZW}$가 있다고 해봅시다. CCW($XYZ$) * CCW($XYW$)가 음수고 CCW($ZWX$) * CCW($ZWY$)가 음수면 이는 확실히 교차한다고 할 수 있습니다. 만약..
27933 - 대회 이름 정하기 step 1더보기카드를 고를 수 있는 구간이 정해졌다고 해봅시다. 그럼 그 구간에는 K들과 Y들이 번갈아가며 있습니다. 각 선수들이 최선을 다해 플레이를 한다면 각 구간 안에서 가장 큰 값을 가져갈 것입니다. step 2더보기연속한 K와 Y를 K묶음, Y묶음으로 표현하겠습니다. 만약 카드를 고를 수 있는 구간 안에 묶음이 포함된다면 그 묶음 안의 최댓값만 알고 있으면 됩니다. 다른 카드는 절대 고르지 않을 것이니까요. 그럼 묶음의 일부만 포함된다면 어떻게 될까요? 우선 묶음의 가운데가 포함된다면 답은 YK 0입니다. 어차피 둘 다 아무것도 고르지 못합니다.그럼 오른쪽이나 왼쪽이 포함되는 경우를 생각해 봅시다. 그럼 포함되는 영역 중 최댓값을 뽑을 것입니다. 그럼 각 위치마다내 묶음의 왼쪽에 있는 값 중 ..