Skip to content

Memoization 적용 및 md파일 수정 #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 48 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,26 @@
## Algorithm basic List

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

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

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

---

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

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

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

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

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

---

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

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

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

---
</br>

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

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

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

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

</br>

Expand Down
53 changes: 40 additions & 13 deletions src/test/java/algorithm/recursion/Dice.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,49 @@ public class Dice {

@Test
public void test() {
assertThat(calcDiceCase(3), is(4));
assertThat(calcDiceCase(4), is(8));
assertThat(calcDiceCase(5), is(16));
assertThat(calcDiceCase(6), is(32));
assertThat(calcDiceCase(7), is(63));
assertThat(calcDiceCase(8), is(125));
assertThat(calcDiceCase1(3), is(4));
assertThat(calcDiceCase1(4), is(8));
assertThat(calcDiceCase1(5), is(16));
assertThat(calcDiceCase1(6), is(32));
assertThat(calcDiceCase1(7), is(63));
assertThat(calcDiceCase1(8), is(125));
assertThat(calcDiceCase1(3), is(4));

assertThat(calcDiceCase2(4), is(8));
assertThat(calcDiceCase2(5), is(16));
assertThat(calcDiceCase2(6), is(32));
assertThat(calcDiceCase2(7), is(63));
assertThat(calcDiceCase2(8), is(125));
}

public int calcDiceCase(int n) {
private int dp[] = new int[1000];
/**
* 메모이제이션을 사용하지 않은 경우
* 단점 : 숫자가 커질수록 느려진다.
*/
public int calcDiceCase1(int n) {
if (n < 0) return 0;
if (n == 0) return 1;
return calcDiceCase1(n - 1) + calcDiceCase1(n - 2) +
calcDiceCase1(n - 3) + calcDiceCase1(n - 4) +
calcDiceCase1(n - 5) + calcDiceCase1(n - 6);
}
/**
* 메모이제이션을 사용하는 경우
* 장점 : 속도가 빠르다.
*/
public int calcDiceCase2(int n) {
if (n < 0) return 0;
if (n == 0) return 1;
return calcDiceCase(n - 1)
+ calcDiceCase(n - 2)
+ calcDiceCase(n - 3)
+ calcDiceCase(n - 4)
+ calcDiceCase(n - 5)
+ calcDiceCase(n - 6);
int result = 0;
for(int i = 1; i<=6; i++){
if(n - i >= 0){
if(dp[n - i] == 0){
dp[n - i] = calcDiceCase2(n - i);
}
result += dp[n - i];
}
}
return result;
}
}