본문 바로가기

Algo/백준

(12)
15990: 1,2,3 더하기 5 (DP) 풀이 처음 배열 선언을 int가 아닌 long으로 해줘야 된다는 점이 중요한 문제이다. 1 = 1 2 = 2 3 = 1+ 2, 2+1, 3 4 = 1+ 2+ 1, 1 + 3, 3 + 1 5 = 1 + 3 + 1, 2 + 3, 2 + 1 + 2, 3 + 2 6 = 1 + 2 + 3, 1 + 2 + 1 + 2, 1 + 3 + 2, 2 + 1 + 3, 2 + 1 + 2 + 1, 3 + 2 + 1, 3 + 1 + 2, 2 + 3 + 1 이를 표로 표현해보면 1 2 3 4 5 6 1 1 1 2 1 3 2 1 1 0 2 3 3 1 1 1 2 4 부터 확인해 보면 dp[n][0] = dp[n-1][1] + dp[n-1][2] dp[n][1] = dp[n-2][0] + dp[n-2][2] dp[n][2] = dp[n-..
1520: 내리막길 (DP) 풀이 dfs와 dp가 혼합된 문제이다. visited배열을 boolean으로 생성하여 체크하지 않고 int로 생성하여 몇번 방문했는지 확인할 수 있게하였다. 0,0에서 시작해서 마지막 N-1, M-1에 도착하면 뒤로 돌아가면서 +하게 해주면 마지막에 도달할 수 있는 개수가 출력되게 된다. 코드 import java.util.Scanner; public class Main { static int[][] arr; static int[][] visited; static int M; static int N; static int H = 0; static int[] dx = { -1, 1, 0, 0 }; static int[] dy = { 0, 0, -1, 1 }; public static void main(Str..
1912: 연속합 (DP) 풀이 첫번째 정수부터 체크하여 현재값을 더한 dp 값과 그 전까지의 dp값을 비교하여 큰 것이 현재까지 최대 dp값이 된다. 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] arr = new int[N]; int[] dp = new int[N]; for (int n = 0; n < N; n++) { arr[n] = sc.nextInt(); } dp[0] = arr[0]; for (int i = 1; i < N; i++) { dp[i] = Math.max(dp[i - 1] + ar..
2156: 포도주 시식 (DP) 풀이 dp를 처음 접해본 문제! 3잔을 연속으로 마실 수 없기 때문에 그때의 max값의 점화식을 구성해보면 된다. 6, 10, 13, 9, 8, 1이 차례로 들어올때 첫번째 6이 들어오면 dp[0]은 첫번째 (6) 두번째 10이 들어오면 dp[1]은 첫번째 + 두번째 (10 + 6) 세번째 13이 들어오면 dp[2]는 첫번째 + 두번째, 두번째 + 세번째, 첫번째 + 세번째 중에 가장 큰 것! 네번째 이후로 max는 그 전에 구했던 dp[i-1]과 dp[i - 2] + arr[i], dp[i - 3] + arr [i] + arr[i - 1]중에 큰 값이 된다. 코드 import java.util.Scanner; public class Main { public static void main(String[]..