본문 바로가기

Problem Solving/DP

BOJ 9084 - 동전 문제 링크(Link)https://www.acmicpc.net/problem/9084 문제 해결(Solution) DP로 문제를 해결한다 1. DP[n][m] : n번 째로 입력받은 동전에서 금액이 m일 때의 방법의 수 (TOP-DOWN) 2. DP[m] : 금액이 m일 때의 방법의 수 (BOTTOM-UP) 주의할 점 || 생각해볼 점(Caution || Consideration) 1. 왜 TOP-DOWN 방식과 BOTTOM-UP 방식일 때의 DP table의 차원 수가 다를까? : BOTTOM-UP 방식일 때는 이중 for loop을 사용해서 동전 조합의 중복을 막을 수 있지만, TOP-DOWN 방식은 동전 조합의 중복을 막기 위해선 입력받은 동전의 순서를 저장해야한다. 그러므로 TOP-DOWN의 DP.. 더보기
BOJ 14863 - 서울에서 경산까지 문제 링크(Link)https://www.acmicpc.net/problem/14863 문제 해결(Solution) DP로 문제를 해결한다(DP table에 따라서 달라지는 수행 시간 비교). 1. DP[n][flag][limit] : n번 째 지점 n+1번 째 지점으로 이동 중 flag(0 : 도보 이용 , 1 : 자전거 이용)면서 소요 시간은 limit일 때의 최대 모금액. 2. DP[limit] : 소요 시간이 limit일 때의 최대 모금액. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. 어떻게 3차원 DP table을 1차원으로 줄일 수 있을까? : 항상 최종 목적지에 도착할 수 있는 조건과 1번 지점부터 N번 지점까지 차례로 이동한다는 점과 어느 교통 수단을 이.. 더보기
BOJ 12841 - 정보대 등산 문제 링크(Link)https://www.acmicpc.net/problem/12841 문제 해결(Solution) DP로 문제를 해결한다. 1. DP[n][chk] : n번 째 지점에서 chk(0 : 횡단 보도를 건너지 않았다 , 1 : 횡단 보도를 건넜다)일 때, 최소 이동거리. 시간 복잡도는 O(N)이 된다. 3. DP를 구하는 과정이 전체 시간을 결정하므로, 전체 시간 복잡도는 O(N)이 된다. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. 횡단 보도는 한 번만 건널 수 있다. 그 때, 어디를 건너야하는 지도 구해야하는 게 조금 까다로울 수 있다. 전역 변수로 vector를 선언한 후, i번 째 횡단 보도를 건널 때가 건너지 않을 때보다 거리가 작거나 같으면 ve.. 더보기
BOJ 1949 - 우수 마을 문제 링크(Link)https://www.acmicpc.net/problem/1949 문제 해결(Solution) Tree를 구현한 후, DP로 문제를 해결. 1. 주어지는 그래프 관계를 트리로 구현한다. 시간복잡도 O(N)이 소요된다. 2. DP[N][Q] : 마을 N에서 Q(0 : 우수 마을로 선정하지 않음, 1 : 우수 마을로 선정)일 때, 우수마을의 인원의 최대 합. 시간복잡도 O(N)이 소요된다. 3. 전체 시간 복잡도는 O(N)이 된다. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. DP의 시간복잡도를 계산하는 것은 생각보다 어렵다. O(N)이라고 적었으나, 사실 그 보단 더욱 많은 시간이 소요된다. 참고(Reference) - ※ 정확하고 부드러운 태클은 언.. 더보기
BOJ 1103 - 게임 문제 링크(Link)https://www.acmicpc.net/problem/1103 문제 해결(Solution) 1. DP를 이용해서 문제 해결한다. 2. 사이클이 존재 여부를 확인하는 bool 배열을 만들어서 확인한다. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. main함수 외에서 프로그램을 강제 종료할 수 있는 exit 함수를 사용. exit의 매개 인자에 0이면 정상 종료, 그 외의 값은 비정상 종료임을 알린다. 2. 사이클의 존재 여부를 확인하는 쉬운 방법. ① 처음 vertex에 방문했을 때, 방문했음을 체크(chk[row][col]=true)한다.② 상하좌우 이동한다. (이 행위는 다른 문제에선 다르게 응용될 수 있다) ③ 언체크(chk[row][col].. 더보기
BOJ 12849 - 본대 산책 문제 링크(Link)https://www.acmicpc.net/problem/12849 문제 해결 (Solution) 1. dp[i][j] = i 건물에서 j분 일 때의 경우의 수. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. 출발 지점과 도착 지점 모두 "정보과학관"이다. 참고(Reference) - ※ 정확하고 부드러운 태클은 언제나 환영입니다. 더보기
BOJ 5721 - 사탕 줍기 대회 문제 링크(Link)https://www.acmicpc.net/problem/5721 문제 해결 (Solution) 1. i번 째 행은 i+2행과는 아무 상관이 없다. i행의 열 중에서 서로 인접하지만 않으면 된다. 2. 1의 조건을 만족시키는 DP table을 생각해보면, 행에 대한 DP와 열에 대한 DP를 따로 만들어 해결하는 게 편함. 3. dp1[i] = i행에서의 최대값. dp2[j] = i행에서 열들을 선택했을 때의 가장 큰 값. 주의할 점 || 생각해볼 점(Caution || Consideration) 1. 처음엔 행과 열을 따로 생각할 수 있다는 생각을 하기 어렵다. 이런 유형이 있다는 것을 알아야한다. 2. 행과 열의 크기가 주어지지 않으므로, 그냥 1차원 배열로 생각하고 인덱스를 잘 다.. 더보기
BOJ 11578 - 팀원 모집 문제 링크https://www.acmicpc.net/problem/11578 문제 해결 1. N(사람의 수)와 M(문제의 수)가 최대 10이므로 비트마스크 DP를 사용해서 문제 해결. 2. dp[a][b] = a만큼의 사람이 b만큼 문제를 풀었을 때의 최소 사람. 주의할 점 || 생각해볼 점 - 참고 - ※ 정확하고 부드러운 태클은 언제나 환영입니다. 더보기
BOJ 2411 - 아이템 먹기 문제 링크https://www.acmicpc.net/problem/2411 문제 해결 1. 아이템을 모두 먹고 (1, 1)에서 (N, M)까지 이동하는 경우의 수를 구하는 문제. DP로 문제 해결. 2. dp[i][j][k] = (i-1, j-1)에서 k개의 아이템을 가지고 있을 때, 위의 1번을 만족하는 경우의 수. 주의할 점 || 생각해볼 점 1. 위치를 나타낼 때, 왼쪽 아래를 (1, 1)로 지정한다. 행을 뒤집어서 생각하면 수월하게 문제를 해결할 수 있다. 이 때, 움직일 수 있는 방향이 {오른쪽, 위} 에서 {오른쪽, 아래}로 바뀐다. 참고 - ※ 정확하고 부드러운 태클은 언제나 환영입니다. 더보기
BOJ 14728 - 벼락치기 문제 링크https://www.acmicpc.net/problem/14728 문제 해결 1. 공부 시간이 한정되어있으므로, 모든 과목을 공부할 수 없다. 2. 현재 과목을 공부했을 때와 하지 않았을 때를 모두 고려해야하므로, DP를 사용해서 문제를 해결한다. 3. DP[i][j] = i번 째 과목에서 j만큼 시간이 남았을 때의 최대 점수. 주의할 점 || 생각해볼 점 1. 공부 시간을 넘어가게 되면 답이 될 수 없는 큰 값을 return해준다. 참고 - ※ 정확하고 부드러운 태클은 언제나 환영입니다. 더보기