본문 바로가기

DP29

[Swift][DP] 백준 12865 (평범한 배낭) 요구능력 : DP문제풀이능력 코드설명 : 문제에 대한 설명은 다른 블로그를 참고했는데 여기 보다 잘 설명할 자신이없어서 소개드립니다. 내가 이해한걸 그대로 적어보면 우선 이 dp문제는 2차원dp이다. 처음에 1차원으로 풀어보려다가 뭔가 1차원으로 푸는게 말이안되는 느낌이 들어서 2차원으로 풀기시작하다가 풀이를봤다. 그런데 역시나 2차원으로 풀리는 dp문제는 표를 그려서 푸는게 가장 이상적인것같다. 이곳에 표를 그려서 푸신 분이 계신다. 내가 가장헷갈렸던 부분은 이 중 for문안에 첫번째 조건인 if j >= items[i - 1][0] 부분인데 왜 저렇게 작은 수부터 시작하지 싶었지만 이 문제는 dp이고 j는 배낭무게이기 때문에 배낭무게에 따라 최대값을 구해주는게 맞는거였다. 그리고 dp[i][j] = .. 2021. 12. 28.
[Swift][DP] 백준 15989번 (1, 2, 3 더하기 4) 요구능력 : DP점화식 코드설명 : 기존의 1,2,3더하기와 비슷한데 "합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다."라는 조건이 붙었다. 1,2,3더하기 문제는 특징이 있는데 1과 2와 3을 기준점으로 세우고 해당하는 수가나오도록 더하는것이다. 예를들어서 4가있으면 3 + 1 2 + 2 1 + 3 이런식으로 기준을 1,2,3으로 두고 문제를 풀면된다. 중복된 수의 순서가 안나오려면 1,2,3을 기준으로 두고 뒤에 나오는수가 작거나같으면된다. 예를들어 4가있으면 1뒤에는 1보다 작거나 같은 수가 나와야한다. 1 + 1 + 1 + 1 2뒤에는 2보다 작거나 같은 수가 나와야한다. 2 + 2, 2 + 1 + 1 3뒤에는 3보다 작거나 같은 수가 나와야한다. 3 + 1 이렇게 4가지 나오게된다... 2021. 12. 18.
[Swift][DP] 백준 11060번 (점프 점프) 요구능력 : DP문제풀이 코드설명 : 왼쪽끝을 1로두고 푸는사람들이 있는데 나는 왼쪽끝에서 시작이라서 안움직인게 맞다고보고 0으로 두고 풀었다. 문제를 잘보면 현재칸 + (1~점프숫자)까지 점프가 가능한것이다. 현재칸은 i로 잡아주고 1~점프숫자는 j로 for문을 생성했다. 가장중요한건 초기 dp숫자를 1001로 설정하는것이다.(Int.max도 가능) 문제에서 미로의 줄은 1~1000까지 주어진다고 했으니까 줄이 1000이 주어졌을때 한번씩 점프해도 1000까지 간다. 그러니까 최대 점프횟수는 1000인것이다. 초기 dp숫자를 1001로 설정해놓아야 n이 1000이 나와도 최소값으로 비교가 가능하고 dp[n]에 들어갈 수 있는 가장 큰 수는 1000인데 1001이라는 숫자가 그대로 들어가있다면 갈 수없는.. 2021. 12. 15.
[Swift][DP] 백준 13398번 (연속합 2) 요구능력 : DP에 대한 이해 코드설명 : 이 문제는 연속합 문제를 선행학습 하고 오셔야 이해가됩니다. 문제의 핵심 1. 연속합 2. 수를 하나 제거할 수 있다. 3. 수를 제거하지 않을 수도있다. 이 문제는 연속합이기 때문에 연속적으로 합을 구해줘야 하는데 수를 하나 뺄수 있다. 중요한점은 꼭 왼쪽에서 부터 시작한다는 생각을 버려야 한다. 만약에 -35라는 수를 빼고 연속합을 구하고싶다면 -35를 기준으로 가장 왼쪽에있는값 10부터 6까지의 연속합과 가장오른쪽에 있는값 -1부터 12까지의 연속합을 구해주면 된다. 이렇게 하면 왼쪽부터 -35만빼고 연속합을 모두 고려할수 있는것이다. 10 -4 3 1 5 6 -35 12 21 -1 n = 정수를 입력받는 부분 arr = n개의 정수로 이루어진 수열 dp_.. 2021. 11. 22.