본문 바로가기
  • 실행력이 모든걸 결정한다
반응형

Algorithm143

[동적계획법, 난이도 중] 백준 2293번 동전 1 동전 i(1≤i≤n)개를 쓰며, j(0≤j≤10) 원을 만드는 모든 경우에 대해 DP를 수행해주면 된다. 예제 입력1에 대해 표를 만들어 보았다. 먼저, 1원 동전으로 0원부터 10원을 만드는 경우의 수는 모두 1이다. 2원 동전으로 0,1원을 만들 수는 없으므로 갱신하지 않고 그대로 1을 따라간다. 2원 동전으로 2원 이상을 만들 때부턴 새로운 경우가 발생한다. 1,2원 동전으로 j-2원을 만드는 경우의 수를 현재 값에 더해주면 되는데, 1,2원 동전으로 j-2원을 만드는 경우들에 2원 동전 하나만 더 추가하면 j원이 완성되기 때문에 이 경우들을 추가해주는 것이다. 1,2,5원 동전을 모두 사용하는 경우에도 똑같이 이를 적용해보자. 5원 동전으로는 5원 이상을 만들 때부터 새로운 경우가 발생한다. 1,.. 2020. 8. 30.
[동적계획법, 난이도 중하] 백준 11057번 오르막 수 만약 끝 자리 수가 j이라면, 다음 자리 수는 j부터 9까지 될 수 있다는 원리를 이용해 DP를 수행하면 되는 문제이다. 오르막 수의 길이가 1인 경우에는, 0부터 9까지 총 10개의 경우의 수가 있다. 즉 길이가 2일 때부터 DP를 수행해주면 되는데, 아래 표에서 설명할 것이다. 아래 표에서 행요소는 자릿수, 열요소는 수의 길이이다. DP[i][j] = 길이가 i인 수에서 i번째 자리의 값이 j인 모든 경우의 수가 되는 것이다. 이 표를 이용하여 답을 구하려면, 각 열 안에 있는 모든 행 요소들을 전부 더하면 된다. 그 것을 아래 표에서는 SUM으로 표시하였다. 최종 출력을 SUM에서 10007로 나눈 나머지값으로 해줘야 하기 때문에 N=7일 경우에는 답으로 11440가 되면 안되고, 1433이 되어야.. 2020. 8. 30.
[동적계획법, 난이도 중] 백준 11052번 카드 구매하기 카드팩을 고를 때 중복을 허용한다는 점에서 조금 까다로울 수 있다. 그러나 이 문제도 점화식 한줄로 풀 수 있다. 카드를 가질 수 있는 경우는 무수히 많기 때문에 동적계획법으로 제한 장 수별로 최댓값을 구해놓아야 한다. 카드를 n개 가져야 할 경우 카드n개팩 그 자체가 가장 비쌀 수도 있고, 카드 n-i개 팩을 사는 최대비용의 경우에 i개 팩을 추가로 샀을 때가 가장 비쌀 수도 있다. 이렇게 동적 계획법으로 접근하면 n개의 경우만을 계산하여 최댓값을 구할 수 있다. 본인이 가져온 예제는 입력 예제4 이다. 처음 한 개 팩을 사는 비용은 5이다. 카드 2장을 사는 경우의 수는 (카드 2장짜리 팩값, 카드 1장을 사는 최대 비용 + 카드 1장짜리 팩값) 이 둘이고, 모두 비용은 10이라 표시는 안난다. 카드.. 2020. 8. 28.
[동적 계획법, 난이도 중] 백준 9465번 스티커 입력이 단순히 일렬로 주어지지 않고, 2차원 표 형식으로 주어지는 종류의 DP문제다. 스티커를 인접하지 않게 고를 수 있는 최대 점수를 계산하는 문제다. 그래도 이 문제는 O(N) 의 시간 복잡도로 해결 할 수 있다. 스티커가 2행 n열로 배치되어 있는데 1열당 2개의 스티커씩 n회 만큼만 DP를 수행하면 된다. 이런 유형의 DP는 한 열 단위로 DP를 수행하려고 하지말고 각 열의 1행, 2행에 대한 DP를 모두 수행해야 한다. 이 문제에서 주어진 예제로 DP를 수행하는 원리를 설명한다. 진행은 1열부터 n열 순으로한다. 입력값 50 10 100 20 40 30 50 70 10 60 두 인접한 스티커는 같이 고를 수 없으므로 초기값은 1열의 값 그대로다. 이제 2열은 위에서 부터 스티커 점수가 10, 5.. 2020. 8. 27.
[동적계획법, 난이도 중] 백준 14501번 퇴사 회사에서 매일 회의가 열리고 각 회의의 기간과 받는 금액이 주어졌을 때, 최대 수익을 계산하는 문제이다. 각 Day마다 열리는 회의가 끝난 후 새로 시작할 수 있는 날을 기록해두고, 현재 Day를 기준으로 이미 끝나 있는 회의 중에서 누적 최대 수익이 큰 경우를 고른 뒤에, 현재 날짜의 회의를 진행하는 식으로 접근하면 된다. 아래 표를 보면 이해가 더 잘될 것이다. S0은 각 Day마다 현재 날짜에 회의 기간을 더한 값들이고, 회의가 끝난 날+1 = 새로 시작할 수 있는 날을 의미한다. 1일차의 경우에는 3일에 걸쳐 회의가 진행되므로 4일차에 새로운 회의를 시작할 수 있다. 즉, S0[1]=4 가 된다. 이런식으로 S0는 쉽게 계산 할 수 있고, S1에 해당하는 DP는 2일차 때부터 진행하면 된다. 현재.. 2020. 8. 26.
[동적계획법, 난이도 중] 백준 9461번 파도반 수열 DP는 점화식은 짧지만 생각이 결론에 도달하여 점화식을 만드는데까지는 시간이 다소 오래 걸린다는 특징이 있다. 특히 이런 도형문제가 그런 편인 것 같은데, 도형쪽으로 센스가 있다면 쉽게 풀 수 있을 것이다. 기준이 되는 첫 삼각형은 크기가 1인 정삼각형이라고 했는데, 아래에 빨간 테두리로 쳐 둔 정삼각형이 기준인 것 같다. 그래야 시계 방향으로 자연스럽고 보기좋게 갱신이 가능하다. 여기서 잘 보면 4번째 삼각형을 처음 포함했을 때부터 쭉 오각형 형태가 유지되며, 6번째 삼각형을 포함하게 될 때부터 새롭게 포함되는 삼각형은 2개의 삼각형 변과 인접하게 된다. 그 2개의 삼각형은 i를 현재 포함하려는 삼각형이라고 하면, i-5번째 삼각형과 i-1번째 삼각형에 해당된다. 이해를 돕기 위해 아래 그림을 첨부하였.. 2020. 8. 25.
[동적계획법, 난이도 중] 백준 11053번 가장 긴 증가하는 부분 수열 제한 시간은 1초며, N의 범위가 (1 ≤ N ≤ 1,000) 으로 좁은 편이기 때문에 O(N^2) 까지 쓸 수 있다. 그래도 이 문제는 1차원 배열의 DP로 풀 수 있다. 첫 INPUT에 대한 DP의 첫 인덱스 값을 1로 두며 시작한다. 그리고 이 조건에 따라 뒤 INPUT값들에 대해 DP를 수행해주면 된다. 현재 INPUT값보다 작은 모든 이전 INPUT값들의 각 DP값들중 최댓값에 1을 더한 값을 현재 DP값으로 지정한다. 만약 현재 INPUT값이 30이라면 이전 INPUT값들은 각각 10, 20, 10이고, 이들의 각 DP값은 1,2,1이다. 1,2,1의 최댓값은 2이기 때문에 이에 1을 더한 3을 현재 DP값으로 지정하는 것이다. 현재 INPUT값이 지금까지 나온 INPUT값들중 최솟값일 경우가.. 2020. 8. 24.
[그리디, 난이도 중하] 백준 2217번 루프 n개의 연결된 루프에 매댈 수 있는 최대 무게를 구할 수 있어야 한다. 이 문제의 예제는 부실하므로 버틸 수 있는 최대 중량이 각각 7, 15, 30, 11, 5인 루프 5개를 준비하였다. 일단 이 루프를 내림차순으로 정렬했다. 30, 15, 11, 5, 7 먼저 최대 중량이 30인 밧줄은 당연히 중량이 30인 물체까지 버틸 수 있다. 그렇다면 1,2번째로 최대 중량이 높은 밧줄인 30, 15를 묶으면 어디까지 버틸 수 있을까? k개의 루프가 묶인다면 중량은 k분의 1로 나뉘게 된다고 했다. 2번째로 최대 중량이 높은 15에 2를 곱한 30이 최대가 된다. 중량이 30인 물체는 저 밧줄들에 각각 15, 15씩 분배가 되므로 30이 최대가 된다는 것을 검산했다. 그렇다면 1,2,3번째로 최대 중량이 높은 .. 2020. 8. 22.
[그래프, 난이도 중상] 백준 1005번 ACM Craft 이 문제는 위상 정렬을 이용하여 풀어야 한다. 위상 정렬이란 자신을 가리키는 노드들이 전부 자신 노드에 방문을 했을 때 다음 노드로 이동할 수 있게 하는 알고리즘이다. 즉, 진입차수가 0인 노드들을 큐에 넣으며 시작하고, 큐에서 꺼낸 노드의 인접노드의 진입 차수를 1씩 감소시키며, 이 결과로 진입 차수가 0이 된 노드들을 다시 큐에 넣는 과정을 반복하는 알고리즘이다. 이전 건물을 다 짓기 전까지는 현재 건물을 짓지 못한다는 조건이 있으므로 위상 정렬을 이용해야 한다는 것이다. 그리고 시간 초과가 나지않게 동적계획법(DP)도 병행하였다. 위상정렬을 수행하며, 이 건물(노드)을 짓는데 걸리는 누적 시간을 업데이트 해주는 것이다. 이전 건물들이 모두 세워져야 현재 건물을 세울 수 있기 때문에 max함수를 이용.. 2020. 8. 20.