dp 7

[백준 5557번] 1학년 - java

문제 설명 1. N개의 숫자가 주어진다. 2. 맨 뒤의 숫자는 결과값이며, +와 -를 사용해가면서 숫자를 만든다. 3. 만들어지는 숫자는 0~20사이의 정수이다. 4. 마지막의 결과값을 만들 수 있는 경우의 수를 구하면 된다. 풀이 과정 1. 처음에는 완전탐색을 사용해야 하는 문제라고 생각했는데, 이거 완탐으로 절대 못푼다. 시간초과가 엄청 날것이다. 2. DP를 사용해서 진행한다. 순서는 아래와 같다. A DP는 이중 배열을 사용하여 [해당process숫자][만들어지는수사] = 가능한 경우의 수 를 저장하도록 한다. B 맨 처음 숫자는 당연히 [0][첫번째입력숫자] = 1일 것이다. C 나는 DP와 완전탐색을 약간 합친 방법을 통해 구현하였는데, 다음번의 경우를 구하려면 이전의 DP에서 만들어진 경우의..

알고리즘 공부 2022.04.07

[백준 2631번] 줄세우기- java

문제 설명 1. N개의 학생이 있다. 2. 학생들을 키순서대로 세워야 한다. 3. 키순서로 세우기 위해 이동시켜야 하는 학생의 최소 숫자를 구하면 된다. 풀이 과정 1. DP를 통해서 진행한다. '가장 긴 증가하는 부분 수열' 문제의 알고리즘을 적용해야 한다. 이전 문제를 풀어봤으면 사실 그 하위호환 문제이다. 근데왜 같은 골5...? 2. 옮길 학생이 아니라, 움직이지 않을 학생수를 구하자! 예를 들어 여기 문제처럼 3 7 5 2 6 1 4 를 보면 가장 긴 증가하는 부분 수열로 구하면 3 - 5 - 6 이렇게 학생들을 보면 얘네가 가장 긴 증가하는 부분 수열이고, 움직이지 않을 최대 숫자이다. 3. 그럼 이제 나머지 애들을 움직여주면 된다. 코드

알고리즘 공부 2022.04.06

[백준 2565번] 전깃줄- java

문제 설명 1. N개의 전깃줄이 있고, 이 전깃줄은 A전봇대와 B전봇대를 연결한다. 2. 전깃줄은 교차되는 경우가 있고, 교차되어서는 안된다. 3. 그렇기 때문에 교차되는 전깃줄을 없애주어야 한다. 4. 교차되는 전깃줄이 없도록, 전깃줄을 제거해주는 최소 개수를 return하면 된다. 풀이 과정 1. DP를 통해서 진행한다. 처음에 생각하는것이 조금 어려운데 '가장 긴 증가하는 부분 수열' 문제의 알고리즘을 적용해야 한다. 2. 위의 그림을 통해 확인해 보면, A전봇대의 숫자에 대해 오름차순으로 정렬한 후, 이곳에서 B와 연결할 때에 큰 위의 가장 긴 증가하는 부분 수열을 적용하면 교차하지 않는 전선의 개수를 구할 수 있게 된다. 그 이유에 대해 말하자면 A 처음 전봇대 기준으로 만약 1 - 8 이 연결..

알고리즘 공부 2022.04.06

[백준 2302번] 극장좌석 - java

문제 설명 1. 좌석의 개수가 주어진다. 2. 각 좌석은 자신의 양옆으로 이동 가능하며, VIP는 이동이 불가능하다. 3. VIP의 위치가 주어질 때 가능한 좌석의 전체 방법 수를 구하여라 풀이 과정 1. DP를 통해서 풀 수 있다. 2. 좌석을 한 칸씩 늘려가며 방법을 구해주면 점화식을 세울 수 있다. 먼저 VIP석이 아예 없는 경우를 예를 들어 1칸 -> 1개 2칸 -> (1 2) (2 1) 2개 3칸 -> (1 2 3) (1 3 2) (2 1 3) 3개 4칸 -> (1 2 3 4) (1 3 2 4) (2 1 3 4) / (1 2 4 3) (2 1 4 3) 5개 .... 이렇게 된다. 4번째 칸을 기준으로 구할 때에는 -> 3칸을 구하는 방법 뒤에 4번째 위치 / 3으로 끝나는 좌석을 4와 위치를 바..

알고리즘 공부 2022.03.03

[백준 1309번] 동물원 - java

문제 설명 1. 2xn크기의 우리를 갖는 동물원이 있다. 2. 사자를 넣는데, 사자의 양옆위아래에는 다른 사자가 있으면 안된다. 3. 모든 사자를 배열하는 방법을 찾는다. 사자의 수는 제한이 없고 아무도 없는 경우도 방법으로 친다. 풀이 과정 1. DP를 통해서 풀 수 있다. 2. 나는 DP의 경우 한번 n이 3이나 4가 될 때 까지는 무작정 경우의 수를 구하는 것이 쉽게 풀 수 있는 방법이라 생각한다. 그래서 그냥 방법을 구해 보았다. 우리 집에 있는 무서운 사자를 우리에 넣어보도록 하겠다. 먼저 2x1의 크기 우리에 사자가 배열되는 경우는 다음 세 가지에 해당한다. 그럼 다음으로 2x2의 우리에 사자를 넣는 경우는 어떻게 될까? 먼저 가장 왼쪽 ox의 경우(o는 사자, x는 빈칸) 이렇게 다음 우리가..

알고리즘 공부 2022.02.26

[백준 1912번] 연속합 - java

문제 설명 1. N개의 숫자를 입력받는다. 2. 숫자들의 합을 구해서 최소숫자를 return하면 된다. 3. 최소 1000 최대 1000까지 간다. 풀이 과정 1. DP를 통해 쉽게 구할 수 있다. 2. 계속 숫자가 커지도록 만들기만 하면 부분합들을 구할 수 있다. 3. DP배열에 현재 숫자를 더했을 때 만들어지는 최대 합을 구하면 된다. 그 방법은 이전 숫자가 양수이면 그곳에 지금수를 더하고, 음수면 0에다가 더하면 된다. ex) 2, 3, -6, 3, -2, 4가 주어지는 경우의 합은 -> 2, (2+3), (2+3-6), 3, (3-2), (3-2+4) 앞의 숫자가 0보다 작으면 없애고 그보다 크면 쓰면 된다. 4. 구해진 합들 중 최대값을 return하면 된다. 코드 mport java.util...

알고리즘 공부 2021.09.03

[프로그래머스] N으로 표현 - java

문제 설명 1. 숫자 N과 number이 주어진다. 2. number을 N을 사용해서 만들 수 있는 경우가 여러 가지 있는데, 이 중 최소횟수를 구한다. 3. 8회 초과이면 -1을 return한다. 풀이 과정 1. DP문제인데 나는 DFS랑 최적해를 섞어서 푼것같다.... DP만으로 푸는 방법은 모르겠음...... 2. N을 통해 +-/*를 해서 구할 수 있는 모든 방법을 구한다. 3. 위의 process를 전체 문자열의 길이만큼 진행하면 구할 수 있다. 4. 그리고 N뿐만 아니라 NN NNN 이런것도 가능하다. 참고로 이경우 count는 당연히 하나 늘어날 것이다. 5. 마지막으로 중요한게 8회 초과이면 -1을 리턴하도록 만들면 된다. tip ) 그리고 시간복잡도를 조금이나마 줄이는 방법인데, 어차피 ..

알고리즘 공부 2021.09.02