Skip to content

Commit

Permalink
day9: (2) dp/2579, dp/1699
Browse files Browse the repository at this point in the history
  • Loading branch information
CheolHoJung committed Apr 16, 2019
1 parent c316a71 commit 6b1aa4d
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ algorithm-practice
[~~2557~~](https://www.acmicpc.net/problem/2557), [~~1000~~](https://www.acmicpc.net/problem/1000), [~~2558~~](https://www.acmicpc.net/problem/2558), [~~10950~~](https://www.acmicpc.net/problem/10950), [~~10951~~](https://www.acmicpc.net/problem/10951), [~~10952~~](https://www.acmicpc.net/problem/10952), [~~10953~~](https://www.acmicpc.net/problem/10953), [~~11021~~](https://www.acmicpc.net/problem/11021), [~~11022~~](https://www.acmicpc.net/problem/11022), [~~11718~~](https://www.acmicpc.net/problem/11718), [~~11719~~](https://www.acmicpc.net/problem/11719), [~~11720~~](https://www.acmicpc.net/problem/11720), [~~11721~~](https://www.acmicpc.net/problem/11721), [~~2741~~](https://www.acmicpc.net/problem/2741), [~~2742~~](https://www.acmicpc.net/problem/2742), [~~2739~~](https://www.acmicpc.net/problem/2739), [~~1924~~](https://www.acmicpc.net/problem/1924), [~~8393~~](https://www.acmicpc.net/problem/8393), [~~10818~~](https://www.acmicpc.net/problem/10818), [~~2438~~](https://www.acmicpc.net/problem/2438), [~~2439~~](https://www.acmicpc.net/problem/2439), [~~2440~~](https://www.acmicpc.net/problem/2440), [~~2441~~](https://www.acmicpc.net/problem/2441), [~~2442~~](https://www.acmicpc.net/problem/2442), [~~2445~~](https://www.acmicpc.net/problem/2445), [~~2522~~](https://www.acmicpc.net/problem/2522), [~~2446~~](https://www.acmicpc.net/problem/2446), [~~10991~~](https://www.acmicpc.net/problem/10991), [~~10992~~](https://www.acmicpc.net/problem/10992)

### DP
[~~1463~~](https://www.acmicpc.net/problem/1463), [~~11726~~](https://www.acmicpc.net/problem/11726), [~~11727~~](https://www.acmicpc.net/problem/11727), [~~9095~~](https://www.acmicpc.net/problem/9095), [~~10844~~](https://www.acmicpc.net/problem/10844), [~~11057~~](https://www.acmicpc.net/problem/11057), [~~2193~~](https://www.acmicpc.net/problem/2193), [~~9465~~](https://www.acmicpc.net/problem/9465), [~~2156~~](https://www.acmicpc.net/problem/2156), [~~11053~~](https://www.acmicpc.net/problem/11053), [~~11055~~](https://www.acmicpc.net/problem/11055), [~~11722~~](https://www.acmicpc.net/problem/11722), [~~11054~~](https://www.acmicpc.net/problem/11054), [~~1912~~](https://www.acmicpc.net/problem/1912), [2579](https://www.acmicpc.net/problem/2579), [1699](https://www.acmicpc.net/problem/1699), [2133](https://www.acmicpc.net/problem/2133), [9461](https://www.acmicpc.net/problem/9461), [2225](https://www.acmicpc.net/problem/2225), [2011](https://www.acmicpc.net/problem/2011), [11052](https://www.acmicpc.net/problem/11052)
[~~1463~~](https://www.acmicpc.net/problem/1463), [~~11726~~](https://www.acmicpc.net/problem/11726), [~~11727~~](https://www.acmicpc.net/problem/11727), [~~9095~~](https://www.acmicpc.net/problem/9095), [~~10844~~](https://www.acmicpc.net/problem/10844), [~~11057~~](https://www.acmicpc.net/problem/11057), [~~2193~~](https://www.acmicpc.net/problem/2193), [~~9465~~](https://www.acmicpc.net/problem/9465), [~~2156~~](https://www.acmicpc.net/problem/2156), [~~11053~~](https://www.acmicpc.net/problem/11053), [~~11055~~](https://www.acmicpc.net/problem/11055), [~~11722~~](https://www.acmicpc.net/problem/11722), [~~11054~~](https://www.acmicpc.net/problem/11054), [~~1912~~](https://www.acmicpc.net/problem/1912), [~~2579~~](https://www.acmicpc.net/problem/2579), [~~1699~~](https://www.acmicpc.net/problem/1699), [2133](https://www.acmicpc.net/problem/2133), [9461](https://www.acmicpc.net/problem/9461), [2225](https://www.acmicpc.net/problem/2225), [2011](https://www.acmicpc.net/problem/2011), [11052](https://www.acmicpc.net/problem/11052)

### 기타
[2751](https://www.acmicpc.net/problem/2751), [11650](https://www.acmicpc.net/problem/11650), [11651](https://www.acmicpc.net/problem/11651), [10814](https://www.acmicpc.net/problem/10814), [10825](https://www.acmicpc.net/problem/10825), [10989](https://www.acmicpc.net/problem/10989), [11652](https://www.acmicpc.net/problem/11652), [11004](https://www.acmicpc.net/problem/11004), [10828](https://www.acmicpc.net/problem/10828), [9012](https://www.acmicpc.net/problem/9012), [10799](https://www.acmicpc.net/problem/10799), [10845](https://www.acmicpc.net/problem/10845), [10866](https://www.acmicpc.net/problem/10866), [10808](https://www.acmicpc.net/problem/10808), [10809](https://www.acmicpc.net/problem/10809), [10820](https://www.acmicpc.net/problem/10820), [2743](https://www.acmicpc.net/problem/2743), [11655](https://www.acmicpc.net/problem/11655), [10824](https://www.acmicpc.net/problem/10824), [11656](https://www.acmicpc.net/problem/11656), [1406](https://www.acmicpc.net/problem/1406), [1158](https://www.acmicpc.net/problem/1158), [1168](https://www.acmicpc.net/problem/1168), [10430](https://www.acmicpc.net/problem/10430), [2609](https://www.acmicpc.net/problem/2609), [1934](https://www.acmicpc.net/problem/1934), [1850](https://www.acmicpc.net/problem/1850), [9613](https://www.acmicpc.net/problem/9613), [11005](https://www.acmicpc.net/problem/11005), [2745](https://www.acmicpc.net/problem/2745), [1373](https://www.acmicpc.net/problem/1373), [1212](https://www.acmicpc.net/problem/1212), [2089](https://www.acmicpc.net/problem/2089), [11576](https://www.acmicpc.net/problem/11576), [1978](https://www.acmicpc.net/problem/1978), [1929](https://www.acmicpc.net/problem/1929), [6588](https://www.acmicpc.net/problem/6588), [11653](https://www.acmicpc.net/problem/11653), [10872](https://www.acmicpc.net/problem/10872), [1676](https://www.acmicpc.net/problem/1676), [2004](https://www.acmicpc.net/problem/2004)
Expand Down
79 changes: 79 additions & 0 deletions dp/o_계단_오르기.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package test.boj.dp;

import org.junit.*;

import java.io.*;

import static org.assertj.core.api.Assertions.assertThat;

public class o_계단_오르기 {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int n = Integer.parseInt(br.readLine());
int[] stairPoints = new int[n];
for (int i = 0; i < n; i++) {
stairPoints[i] = Integer.parseInt(br.readLine());
}

Stairs stairs = new Stairs(n, stairPoints);
bw.write(String.valueOf(stairs.climb()));

bw.flush();
bw.close();
br.close();
}


@Test
public void test() {
Stairs stairs = new Stairs(6, new int[]{10, 20, 15, 25, 10, 20});
assertThat(stairs.climb())
.isEqualTo(75);
}

private static class Stairs {

private static final int MAX_COUNT = 300;

private final int[] stairPoints;

private final int[] dp;

public Stairs(int n, int[] stairPoints) {
this.stairPoints = new int[n + 1];
this.dp = new int[MAX_COUNT + 1];
for (int i = 1; i <= n; i++) {
this.stairPoints[i] = stairPoints[i - 1];
}
}

public int climb() {
dp[1] = this.stairPoints[1];
dp[2] = dp[1] + this.stairPoints[2];

for (int i = 3; i < this.stairPoints.length; i++) {
dp[i] = Math.max(climbOneStair(i), climbTwoStair(i));
}

return dp[this.stairPoints.length - 1];
}

// 두 칸을 오르는 경우: 두 칸을 오르는 경우에는 3칸 연속 법칙이 성립할 수가 없음
// 그러므로 두번 째 이전 칸에서의 최대 포인트과 현재 칸의 포인트를 더함
private int climbTwoStair(int pos) {
if (pos < 3) throw new IllegalArgumentException();
return this.stairPoints[pos] + this.dp[pos - 2];
}

// 한 칸을 오르는 경우: 3칸 연속 법칙 때문에 두번 째 이전 칸에 있는 계단과는 함께 오를 수 없음
// 그러므로 현재 칸의 포인트와 이전 칸의 포인트를 더한 뒤
// 세번 째 이전 칸에서의 최대 포인트와 더함
private int climbOneStair(int pos) {
if (pos < 3) throw new IllegalArgumentException();
return this.stairPoints[pos] + this.stairPoints[pos - 1] + this.dp[pos - 3];
}
}
}
84 changes: 84 additions & 0 deletions dp/p_제곱수의_합.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package test.boj.dp;

import org.junit.*;

import java.io.*;

import static org.assertj.core.api.Assertions.assertThat;

// https://cheolhojung.github.io/posts/algorithm/boj- sum-of-squares.html
public class p_제곱수의_합 {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

bw.write(String.valueOf(solution2(Integer.parseInt(br.readLine()))));

bw.flush();
bw.close();
br.close();
}

@Test
public void test() {
// assertThat(solution2(7))
// .isEqualTo(4);
// assertThat(solution2(11))
// .isEqualTo(3);
// assertThat(solution2(12))
// .isEqualTo(3);
// assertThat(solution2(100_000))
// .isEqualTo(2);
// assertThat(solution2(10_000))
// .isEqualTo(1);
assertThat(solution2(142))
.isEqualTo(3);
}

private static int solution2(int n) {
int [] dp = new int[n + 1];

for(int i = 1; i <= n; i++) {
dp[i] = i;
for(int j = 1, pow = j * j; pow <= i; j++, pow = j * j)
if(dp[i] > dp[i - pow] + 1)
dp[i] = dp[i - pow] + 1;
}
return dp[n];
}

// n이 제곱이면 dp[n] = 2
// n이 제곱이 아니라면, (n - i => i) dp[n] = min((dp[n - 1] + dp[1]) .... dp[n - i] + dp[i])
private static int solution(int n) {
final int MAX_SQUARE = 100_001;
final int MAX_SQRT = (int) Math.sqrt(MAX_SQUARE);
boolean[] isSquare = new boolean[MAX_SQUARE];
int[] dp = new int[n + 1];

isSquare[1] = true;
dp[1] = 1;

for (int i = 2; i <= n; i++) {
if (isSquare[i]) {
dp[i] = 1;
} else {
dp[i] = getMin(dp, i);
}

if (i <= MAX_SQRT) {
isSquare[i * i] = true;
}
}

return dp[n];
}

private static int getMin(int[] dp, int n) {
int min = Integer.MAX_VALUE;
for (int i = 1; n - i >= i; i++) {
min = Math.min(min, dp[n - i] + dp[i]);
}
return min;
}
}

0 comments on commit 6b1aa4d

Please sign in to comment.