Skip to content

Commit d4be9b9

Browse files
KSH-codejbee37142
authored andcommitted
feat(code): Add code to Dics.java
author: [KSH-code](https://github.com/KSH-code) * Memorization 적용 * source code link 수정 * Update Dice.java * 비교코드 추가
1 parent e3108bf commit d4be9b9

File tree

2 files changed

+88
-61
lines changed

2 files changed

+88
-61
lines changed

README.md

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,26 @@
66
## Algorithm basic List
77

88
### String basic part
9-
* 주어진 문자열을 int 형으로 변환한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/StringParseToInt.java)
10-
* 주어진 문자열을 역순으로 출력한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/StringReverse.java)
11-
* 주어진 문자열에서 문자열을 구성하고 있는 각각의 문자열들이 고유한지를 판단한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/UniqueCharacterInString.java)
12-
* 주어진 문자열이 애너그램인지를 판단한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/IsAnagram.java)
13-
* 주어진 문자열을 길이와 함께 적어주면서 압축을 한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/CharacterCompressWithLength.java)
14-
* 주어진 문서(단어별로 나뉘어진 배열)에서 특정 단어의 빈도를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basic/FrequencyStringInDocument.java)
9+
* 주어진 문자열을 int 형으로 변환한다. [code](src/test/java/algorithm/basic/StringParseToInt.java)
10+
* 주어진 문자열을 역순으로 출력한다. [code](src/test/java/algorithm/basic/StringReverse.java)
11+
* 주어진 문자열에서 문자열을 구성하고 있는 각각의 문자열들이 고유한지를 판단한다. [code](src/test/java/algorithm/basic/UniqueCharacterInString.java)
12+
* 주어진 문자열이 애너그램인지를 판단한다. [code](src/test/java/algorithm/basic/IsAnagram.java)
13+
* 주어진 문자열을 길이와 함께 적어주면서 압축을 한다. [code](src/test/java/algorithm/basic/CharacterCompressWithLength.java)
14+
* 주어진 문서(단어별로 나뉘어진 배열)에서 특정 단어의 빈도를 구한다. [code](src/test/java/algorithm/basic/FrequencyStringInDocument.java)
1515

1616
### Basic Math
17-
* 주어진 두 수의 최대 공약수와 최소 공배수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/GcdAndGcm.java)
18-
* n개의 서로 다른 원소 중 r개의 원소를 순서없이 선택하는 방법의 수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/BasicCombination.java)
19-
* 주어진 수보다 작은 소수의 개수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/FindPrimeNumTest.java)
20-
* Fibonacci 를 계산하는 함수를 작성한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/Fibonacci.java)
21-
* 주어진 정수의 각 자리 수의 합을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/SumEachNum.java)
22-
* 사다리를 한 칸 또는 두 칸씩 오를 수 있다고 했을 때 사다리 높이에 따른 사다리 오르기 방법의 경우의 수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/basicMath/Ladder.java)
17+
* 주어진 두 수의 최대 공약수와 최소 공배수를 구한다. [code](src/test/java/algorithm/basicMath/GcdAndGcm.java)
18+
* n개의 서로 다른 원소 중 r개의 원소를 순서없이 선택하는 방법의 수를 구한다. [code](src/test/java/algorithm/basicMath/BasicCombination.java)
19+
* 주어진 수보다 작은 소수의 개수를 구한다. [code](src/test/java/algorithm/basicMath/FindPrimeNumTest.java)
20+
* Fibonacci 를 계산하는 함수를 작성한다. [code](src/test/java/algorithm/basicMath/Fibonacci.java)
21+
* 주어진 정수의 각 자리 수의 합을 구한다. [code](src/test/java/algorithm/basicMath/SumEachNum.java)
22+
* 사다리를 한 칸 또는 두 칸씩 오를 수 있다고 했을 때 사다리 높이에 따른 사다리 오르기 방법의 경우의 수를 구한다. [code](src/test/java/algorithm/basicMath/Ladder.java)
2323

2424
### Recursion part
25-
* 주사위로 이동 가능한 경우의 수를 모두 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/recursion/Dice.java)
26-
* n비트의 모든 경우의 수를 출력한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/recursion/NBitWays.java)
27-
* 순열을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/recursion/Permutation.java)
28-
* N개 괄호로 만들 수 있는 모든 조합 출력하기. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/recursion/BraceCombination.java)
25+
* 주사위로 이동 가능한 경우의 수를 모두 구한다. [code](src/test/java/algorithm/recursion/Dice.java)
26+
* n비트의 모든 경우의 수를 출력한다. [code](src/test/java/algorithm/recursion/NBitWays.java)
27+
* 순열을 구한다. [code](src/test/java/algorithm/recursion/Permutation.java)
28+
* N개 괄호로 만들 수 있는 모든 조합 출력하기. [code](src/test/java/algorithm/recursion/BraceCombination.java)
2929

3030
---
3131

@@ -36,71 +36,71 @@
3636
* 역순으로 출력한다.
3737
* k번째 원소를 찾는다.
3838
* 회문인지 판단한다.
39-
[code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/codeedlist/SinglecodeedListTest.java)
39+
[code](src/test/java/datastructure/codeedlist/SinglecodeedListTest.java)
4040

4141
### Stack
42-
* Array를 사용하여 Stack을 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/stack/MyStackWithArrayTest.java)
43-
* ArrayList를 사용하여 Stack을 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/stack/MyStackWithArrayListTest.java)
44-
* Stack에 저장된 값들 중 최소값을 반환하는 minStack() 함수를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/stack/MinimumStackTest.java)
45-
* Stack 자료구조를 사용하여 회문을 판별한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/stack/IsPalindromeTest.java)
46-
* 괄호의 유효성을 체크한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/stack/CheckBrace.java)
42+
* Array를 사용하여 Stack을 구현한다. [code](src/test/java/datastructure/stack/MyStackWithArrayTest.java)
43+
* ArrayList를 사용하여 Stack을 구현한다. [code](src/test/java/datastructure/stack/MyStackWithArrayListTest.java)
44+
* Stack에 저장된 값들 중 최소값을 반환하는 minStack() 함수를 구현한다. [code](src/test/java/datastructure/stack/MinimumStackTest.java)
45+
* Stack 자료구조를 사용하여 회문을 판별한다. [code](src/test/java/datastructure/stack/IsPalindromeTest.java)
46+
* 괄호의 유효성을 체크한다. [code](src/test/java/datastructure/stack/CheckBrace.java)
4747

4848
### Queue
49-
* Stack을 사용하여 queue를 stack처럼 만든다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/queue/ReverseQueueTest.java)
50-
* Stack 두 개로 Queue를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/queue/QueueWithTwoStack.java)
49+
* Stack을 사용하여 queue를 stack처럼 만든다. [code](src/test/java/datastructure/queue/ReverseQueueTest.java)
50+
* Stack 두 개로 Queue를 구현한다. [code](src/test/java/datastructure/queue/QueueWithTwoStack.java)
5151

5252
### BinaryTree
5353
* 바이너리 트리에서 최대값을 구한다.
5454
* 주어진 바이너리 트리가 균형 잡힌 트리인지 판별한다.
5555
* 오름차순으로 정렬된 배열을 Binary Search Tree로 변환한다.
5656
* 주어진 트리가 BST인지 확인한다.
57-
[code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/binaryTree/BinaryTree.java)
57+
[code](src/test/java/datastructure/binaryTree/BinaryTree.java)
5858

5959
### Priority Queue
60-
* Priority queue를 사용하여 heap sort를 하라. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/priorityqueue/HeapSortByUsingPQ.java)
61-
* 많은 수 중 top 10을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/datastructure/priorityqueue/CalcTopTen.java)
60+
* Priority queue를 사용하여 heap sort를 하라. [code](src/test/java/datastructure/priorityqueue/HeapSortByUsingPQ.java)
61+
* 많은 수 중 top 10을 구한다. [code](src/test/java/datastructure/priorityqueue/CalcTopTen.java)
6262

6363
---
6464

6565
## Sort and Search
66-
* bubble sort를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/sort/BubbleSort.java)
67-
* Insertion sort를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/sort/InsertionSort.java)
68-
* Selection sort를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/sort/SelectionSort.java)
69-
* Quick sort를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/sort/QuickSort.java)
70-
* radix sort를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/sort/RadixSort.java)
66+
* bubble sort를 구현한다. [code](src/test/java/sort/BubbleSort.java)
67+
* Insertion sort를 구현한다. [code](src/test/java/sort/InsertionSort.java)
68+
* Selection sort를 구현한다. [code](src/test/java/sort/SelectionSort.java)
69+
* Quick sort를 구현한다. [code](src/test/java/sort/QuickSort.java)
70+
* radix sort를 구현한다. [code](src/test/java/sort/RadixSort.java)
7171

7272
### Search
73-
* binary search를 사용하여 O(log n)의 시간복잡도로 target을 찾는다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/search/BinarySearchTest.java)
74-
* 정렬된 2차원 배열에서 검색한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/search/SearchIn2DTest.java)
73+
* binary search를 사용하여 O(log n)의 시간복잡도로 target을 찾는다. [code](src/test/java/search/BinarySearchTest.java)
74+
* 정렬된 2차원 배열에서 검색한다. [code](src/test/java/search/SearchIn2DTest.java)
7575

7676
### bit
7777
* 2의 제곱수인지 판별한다.
7878
* 두 수에서 다른 비트의 개수를 구한다.
79-
[code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/bit/BitOperator.java)
80-
* O(1)으로 해당 데이터가 존재하는지 판단한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/bit/BitMapTest.java)
79+
[code](src/test/java/bit/BitOperator.java)
80+
* O(1)으로 해당 데이터가 존재하는지 판단한다. [code](src/test/java/bit/BitMapTest.java)
8181

8282
---
8383
</br>
8484

8585
## 알고리즘 문제 풀어보기
8686

8787
### Dynamic Programming
88-
* Jump game [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/algorithm/dp/JumpGame.java)
88+
* Jump game [code](src/test/java/algorithm/dp/JumpGame.java)
8989

9090
### Exercise
91-
* 주어진 배열에서 양 쪽의 합이 동일해지는 index의 값을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/SearchEquilibrium.java)
92-
* n!의 결과값에서 0의 개수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/FactorialZeroCount.java)
93-
* temp 를 사용하지 않고 두 변수를 swap 한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/NoTempSwapTest.java)
94-
* 어느날의 월, 일을 입력받아 요일을 반환하는 함수를 구현한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/CalenderExample.java)
95-
* 주어진 배열에서 합이 최대가 되는 sub array의 합을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/FindMaxSumInArray.java)
96-
* 주어진 두 수 사이에 존재하는 수 중 제곱수가 되는 것을 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/FindSquareNum.java)
97-
* 주어진 배열로 구성된 링크드 리스트의 길이를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/LinkedListLength.java)
98-
* 주어진 배열에서 두 자리수만 골라서 합한 값을 return 한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/OnlyTwoDigitSum.java)
99-
* 각각의 주사위들이 모두 같은 면을 보이기 위한 최소 rotate 횟수를 구한다. [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/exercise/SameFaceDice.java)
91+
* 주어진 배열에서 양 쪽의 합이 동일해지는 index의 값을 구한다. [code](src/test/java/exercise/SearchEquilibrium.java)
92+
* n!의 결과값에서 0의 개수를 구한다. [code](src/test/java/exercise/FactorialZeroCount.java)
93+
* temp 를 사용하지 않고 두 변수를 swap 한다. [code](src/test/java/exercise/NoTempSwapTest.java)
94+
* 어느날의 월, 일을 입력받아 요일을 반환하는 함수를 구현한다. [code](src/test/java/exercise/CalenderExample.java)
95+
* 주어진 배열에서 합이 최대가 되는 sub array의 합을 구한다. [code](src/test/java/exercise/FindMaxSumInArray.java)
96+
* 주어진 두 수 사이에 존재하는 수 중 제곱수가 되는 것을 구한다. [code](src/test/java/exercise/FindSquareNum.java)
97+
* 주어진 배열로 구성된 링크드 리스트의 길이를 구한다. [code](src/test/java/exercise/LinkedListLength.java)
98+
* 주어진 배열에서 두 자리수만 골라서 합한 값을 return 한다. [code](src/test/java/exercise/OnlyTwoDigitSum.java)
99+
* 각각의 주사위들이 모두 같은 면을 보이기 위한 최소 rotate 횟수를 구한다. [code](src/test/java/exercise/SameFaceDice.java)
100100

101101
### Famous Algorithm
102-
* Karp_Rabin_Algorithm [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/famous_algorithm/Karp_Rabin_Algorithm.java)
103-
* KMP_Algorithm [code](https://github.com/JaeYeopHan/algorithm_basic_java/blob/master/src/test/java/famous_algorithm/KMP_Algorithm.java)
102+
* Karp_Rabin_Algorithm [code](src/test/java/famous_algorithm/Karp_Rabin_Algorithm.java)
103+
* KMP_Algorithm [code](src/test/java/famous_algorithm/KMP_Algorithm.java)
104104

105105
</br>
106106

src/test/java/algorithm/recursion/Dice.java

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,49 @@ public class Dice {
1414

1515
@Test
1616
public void test() {
17-
assertThat(calcDiceCase(3), is(4));
18-
assertThat(calcDiceCase(4), is(8));
19-
assertThat(calcDiceCase(5), is(16));
20-
assertThat(calcDiceCase(6), is(32));
21-
assertThat(calcDiceCase(7), is(63));
22-
assertThat(calcDiceCase(8), is(125));
17+
assertThat(calcDiceCase1(3), is(4));
18+
assertThat(calcDiceCase1(4), is(8));
19+
assertThat(calcDiceCase1(5), is(16));
20+
assertThat(calcDiceCase1(6), is(32));
21+
assertThat(calcDiceCase1(7), is(63));
22+
assertThat(calcDiceCase1(8), is(125));
23+
assertThat(calcDiceCase1(3), is(4));
24+
25+
assertThat(calcDiceCase2(4), is(8));
26+
assertThat(calcDiceCase2(5), is(16));
27+
assertThat(calcDiceCase2(6), is(32));
28+
assertThat(calcDiceCase2(7), is(63));
29+
assertThat(calcDiceCase2(8), is(125));
2330
}
2431

25-
public int calcDiceCase(int n) {
32+
private int dp[] = new int[1000];
33+
/**
34+
* 메모이제이션을 사용하지 않은 경우
35+
* 단점 : 숫자가 커질수록 느려진다.
36+
*/
37+
public int calcDiceCase1(int n) {
38+
if (n < 0) return 0;
39+
if (n == 0) return 1;
40+
return calcDiceCase1(n - 1) + calcDiceCase1(n - 2) +
41+
calcDiceCase1(n - 3) + calcDiceCase1(n - 4) +
42+
calcDiceCase1(n - 5) + calcDiceCase1(n - 6);
43+
}
44+
/**
45+
* 메모이제이션을 사용하는 경우
46+
* 장점 : 속도가 빠르다.
47+
*/
48+
public int calcDiceCase2(int n) {
2649
if (n < 0) return 0;
2750
if (n == 0) return 1;
28-
return calcDiceCase(n - 1)
29-
+ calcDiceCase(n - 2)
30-
+ calcDiceCase(n - 3)
31-
+ calcDiceCase(n - 4)
32-
+ calcDiceCase(n - 5)
33-
+ calcDiceCase(n - 6);
51+
int result = 0;
52+
for(int i = 1; i<=6; i++){
53+
if(n - i >= 0){
54+
if(dp[n - i] == 0){
55+
dp[n - i] = calcDiceCase2(n - i);
56+
}
57+
result += dp[n - i];
58+
}
59+
}
60+
return result;
3461
}
3562
}

0 commit comments

Comments
 (0)