diff --git "a/sollyj/week4/\353\217\204\353\221\221\354\247\210.java" "b/sollyj/week4/\353\217\204\353\221\221\354\247\210.java" new file mode 100644 index 0000000..e8fb72a --- /dev/null +++ "b/sollyj/week4/\353\217\204\353\221\221\354\247\210.java" @@ -0,0 +1,42 @@ +// Programmers_도둑질 +package sollyj.week4; + +public class 도둑질 { + public static void main(String[] args) { + System.out.println(solution(new int[] {1, 2, 3, 1})); + } + + private static int solution(int[] money) { + int answer = 0; + int len = money.length; + + // 1. n번째 집을 털었을때 훔친 돈의 최댓값이 들어갈 배열 선언 + int[] dp_first = new int[len]; // 첫번째 집을 터는 경우 + int[] dp_second = new int[len]; // 첫번째 집을 안 터는 경우 + + // 2. 배열 초기값 + for (int i = 0; i < len; i++) { + dp_first[i] = money[i]; + dp_second[i] = money[i]; + } + + dp_first[1] = -1; // 두번째집 안털기 + dp_second[0] = -1; // 첫번째집 안털기 + dp_first[2] += dp_first[0]; // 집의 개수는 최소 3개이므로, dp_first[2]의 초기값도 넣어준다. + + // 3. 점화식 + for (int i = 3; i < len; i++) { + // 인접하지 않은 집(i - 2, i - 3)과 비교해 더 큰 값을 누적해 더해줌 + dp_first[i] += Math.max(dp_first[i - 3], dp_first[i - 2]); + dp_second[i] += Math.max(dp_second[i - 3], dp_second[i - 2]); + } + + // 맨 마지막 두집을 비교하여 최댓값 찾기 + int first_max = Math.max(dp_first[len - 2], dp_first[len - 3]); // 첫번째 집을 털었으니까 맨 마지막 집은 어차피 못 턴다. + int second_max = Math.max(dp_second[len - 1], dp_second[len - 2]); // 첫번째 집을 안 털었으니까 맨 마지막 집 털 수 있다. + + answer = Math.max(first_max, second_max); + + return answer; + } +} diff --git "a/sollyj/week4/\355\207\264\354\202\254.java" "b/sollyj/week4/\355\207\264\354\202\254.java" new file mode 100644 index 0000000..b6023a5 --- /dev/null +++ "b/sollyj/week4/\355\207\264\354\202\254.java" @@ -0,0 +1,48 @@ +// Baekjoon_14501_퇴사 +package sollyj.week4; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class 퇴사 { + public static void main(String[] args) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { + StringTokenizer st; + + int N = Integer.parseInt(br.readLine()); + int[] T = new int[N]; // 상담 기간 + int[] P = new int[N]; // 금액 + + // 1. 테이블 정의 + // n일까지의 최대 수익 + int[] profit_max = new int[N + 1]; + + // 2. 초기값 세팅 + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + + T[i] = Integer.parseInt(st.nextToken()); + P[i] = Integer.parseInt(st.nextToken()); + } + + // 3. 점화식 + for(int i = 0; i < N; i++) { + if(i + T[i] <= N) { // i일에 상담을 했을때 퇴사일 까지 상담을 마칠수 있다면 + // profit_max[i + T[i]]: 현재 값 + // profit_max[i] + P[i]: i일에 상담을 했을 때 수익 + profit_max[i + T[i]] = Math.max(profit_max[i + T[i]], profit_max[i] + P[i]); + } + + // 예외 (예제 입력4 같은 경우) + // 꼭 i + T[i]만 상담 할 수 있는 것은 아니고, 상담 다음날 상담을 할 수도 있는 것이다. + profit_max[i + 1] = Math.max(profit_max[i], profit_max[i + 1]); + } + + // 4. 답 도출 + System.out.println(profit_max[N]); + } catch (Exception e) { + System.out.println(e.getLocalizedMessage()); + } + } +}