모든 칸 (y, x)에 대해, 단어의 글자 수 Z에 대해 인덱스 Z-2에서 역순으로 현재 위치와 갈 수 있는 위치의 글자가 단어의 i번과 i+1번이라면 memoix에 memo\[i+1]\[new_y]\[new_x]만큼 경우의 수를 더한다.모든 칸에 대해 memo\[0]
기본적으로 $1, 2, ..., a-1, \\max(a, b), b-1, b-2, ..., 2, 1$ 순서를 유지하면 가희와 단비가 볼 수 있는 건물의 수에 대한 조건을 만족할 수 있다.남은 빈 자리에는 높이 1의 건물을 가능한 왼쪽부터 채우면 될 것이다.이때 $a =
고객 p\[j]명을 늘리기 위해 co\[j]의 비용이 든다고 하면...고객을 i명 늘이기 위한 최소 비용 memo\[i]는 memo\[i - p\[j]] + co\[j]의 최솟값이다.고객을 '최소' C명 이상 늘리면 되므로 memo\[C]~memo\[C + (p\[i]
관계를 그래프(인접리스트)로 가지고 N번 부품(완제품)부터 해체해보자.이때, 다른 상위 제품이 남아있을 때 해체를 해버리면 상위 제품을 해체할 때 다시 재해체해야하므로, 상위 제품이 남아있지 않은 부품만 해체하자.이는 그래프의 입력차수가 0인지 아닌지를 보면 된다. 즉
사이클을 감지해야한다는 점에서 위상정렬을 시도해봤다.메모리: 305408 KB시간: 1104 ms풀긴 풀었는데, 메모리와 시간을 봐서 정해는 아닌 것 같다. 더 효율적인 풀이를 찾아봐야겠다.
아이디어 4가지 연산을 수행하는 경우를 그래프가 이어진 것으로 생각하여 풀어야 하는 문제 가장 연산 수가 짧은 것을 찾아야 하므로 BFS으로 찾아야 한다. 코드 메모리 및 시간 메모리: 24644 KB 시간: 840 ms 리뷰 이 문제를 stack을 이용해 풀 수
핵심 아이디어는 숫자를 지웠을 때 왼쪽이 가장 크도록 하는 것이다..입력은 Doubly linked list를 사용해 받았다.수의 가장 첫 자리부터 탐색한다.만약 지울 수 있는 횟수 k가 남아있고, 다음 자리보다 더 작은 숫자라면 지운다.아니라면 다음 자리로 이동한다.
크게 상어 잡기, 상어 이동, 잡아먹기로 나뉜다.해당 열의 상어를 빠르게 탐색하기 위해서는 2차원 지도 기반의 자료구조(map)가 필요하다.한편, 상어 전체를 관리하는 자료구조(sharks)가 필요하니 둘 다 사용해야 한다.상어 이동2(R-1) 또는 2(C-1) 칸 이
Doubly linked list 형태로 변경 내역(hist ← history)를 관리하자. 현재 가리키고 있는 노드를 head라 하자.최초의 head는 -1 값을 가지고 있는 더미 노드다.hist\[i]에는 i번째 변경 전의 head를 가리킨다.'추가' 쿼리라면 새
토네이도 표현토네이도의 바람은 방향과 세기로 나눌 수 있다. \* 방향은 ←, ↓, →, ↑ 순서로 계속 회전한다.세기는 1, 1, 2, 2, 3, 3, ..., N-2, N-2, N-1, N-1, N-1과 같이 세기가 증가하며 2번씩 등장한 후, 추가로 N-1 세기
각 점을 분리집합으로 관리하자.분리집합을 합집합(union)할 때 서로 같은 집합에 합집합을 하게 된다면 사이클이 생기는 경우다.메모리: 150212 KB시간: 536 msUnion-find 코드를 더 효율적인 것으로 외워놔야겠다.
MST는 $N-1$개의 간선을 가져야 한다.만약 여기서 하나의 간선이 끊어질 경우, 그래프가 두 개의 연결그래프로 나뉜다.따라서 기존 MST와 달리 $N-2$개의 간선을 짧은 순서대로 연결한다.Kruskal을 사용하자.메모리: 332564 KB시간: 1732 ms메모리
기본적으로 브루트포스백트래킹을 이용해 가망이 없는 스도쿠 상태로 접근할 수 없도록 해야 한다.스도쿠의 게임 규칙을 위반하게 되는 상태가 되면 이전 상태로 되돌아간다.가로줄, 세로줄, 또는 해당 칸이 위치한 3x3 블록 내에 같은 숫자가 없어야 한다.이러한 조건은 비트마
오른쪽으로 범위를 늘리다가, 부분합이 $S$ 이상이 되면 왼쪽 끝에서부터 부분합에서 반대로 빼보며 길이를 얼마나 낮출 수 있는 지 본다.만약 부분합이 전체 합이라도 $S$ 이상이 되지 못하면 "0"을 출력한다.메모리: 23820 KB시간: 284 ms투 포인터 문제도
변수가 4개 있다. (현재 레벨 $n$, 빨강 $r$, 초록 $g$, 파랑 $b$)4차원 동적 테이블을 사용한다. 여기서는 $f(n, r, g, b)$라 쓰자.경우를 나눠보자.$n$이 1로 나누어 떨어지는 경우(모든 경우): 빨강, 초록, 파랑을 사용하는 3가지 경우를
최단경로 찾는 문제니 Dijkstra로 푼다.$O(V^2)$이어도 상관 없다.경로 찾는 방법어떤 점에 도달하는 최단경로는, 그 점의 이전 점까지 도달하기 위한 최단경로를 반드시 지난다.Dijkstra는 시점부터 종점까지 거치는 모든 경로상 점에 대해 최단거리를 구할 수
그래프는 인접행렬로 받는다.모든 도시에 대해 연결된 도시끼리 분리집합(union-find)를 형성하자.여행 계획에서, 인접한 두 점끼리 같은 집합에 있으면 해당 두 도시 사이에는 경로가 있다는 뜻이다.중간에 경로가 끊기는 도시가 있다면 "NO", 아니면 "YES"다.메
구하는 값은 이전까지 구했던 힘의 합에 새로 밟는 움직임에 대한 힘을 더하는 형태로 이루어진다.즉, 부분 중복문제, 최적 부분문제의 형태를 띄고 있다.DP를 생각하여, 필요한 변수를 생각해보면, 현재 길이, 왼발과 오른발의 위치에 영향을 받음을 알 수 있다. 따라서 3
정답은 숫자의 길이, 현재 등장한 숫자들의 집합, 그리고 마지막으로 자리에 영향을 받는다.이전 길이와 이전 길이의 숫자 집합, 마지막 자리에 따라 부분문제 관계가 성립한다.$f(i, S, j) = f(i-1, S - {j}, j) + f(i-1, S, j)$구하는 답은