Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- #리버싱
- Spring
- #abex크랙미
- #크랙미
- java8
- #고클린
- #심플즈 크랙미
- springframework
- #크랙미 9번
- #abex
- #파밍
- java
- GraphQL
- #보안이슈
- #보안뉴스
- #크랙미4번
- Easy
- #abex크랙미4번
- #심플즈
- #크랙미3번
- #크랙미 5번
- leetcode
- #크랙미2번
- #크랙미 10번
- 리버싱
Archives
- Today
- Total
Halo World
LeetCode 1025. Divisor Game - DP 본문
leetcode.com/problems/divisor-game/
해당 문제는 DP로 풀수 있는 문제.
알고리즘을 안한지 오래되어 차근차근 공부하는 중 DP 관련하여 잘 정리되어있는 블로그가 있어 참고해서 개념 잡았다.
[풀이]
핵심은 dp[N-x]가 false 이면 dp[N]은 true 라는 것
: dp[N-x]가 false 면 Bob이 이기는 것이고, 여기서 한번 더 기회가 있었다면 Alice가 이긴다는 뜻이기 때문이다.
1. Bottom Up 방식 - LeetCode best 솔루션 참고
class Solution {
public boolean divisorGame(int N) {
boolean dp[] = new boolean[N+1];
for(int i=2; i<=N; i++){
for(int j=1; j<Math.sqrt(i); j++){
if((i%j==0) && (!dp[i-j])){
dp[i]=true;
break;
}
}
}
return dp[N];
}
}
두번째 for문에서 Math.sqrt(i) 까지만을 조건으로한 이유는 뭘까..
2. Top Down 방식
class Solution {
int[] dp = new int[1001];
public boolean divisorGame(int N) {
dp[1]=1;
int result = cal(N);
if(result == 2){
return true;
}
return false;
}
private int cal(int N) {
if(dp[N]>0) {
return dp[N];
}
for(int i=1;i<N;i++){
if(N%i==0 && (cal(N-i) == 1)) {
dp[N]=2;
return dp[N];
}
}
dp[N]=1;
return dp[N];
}
}
'개발 지식 > ALGORITHM' 카테고리의 다른 글
분할정복 (0) | 2021.04.20 |
---|---|
리스트로 구현한 스택 (0) | 2017.07.11 |
정렬 알고리즘 (0) | 2017.06.03 |