diff --git a/climbing-stairs/sangyyypark.java b/climbing-stairs/sangyyypark.java new file mode 100644 index 0000000000..8172214cef --- /dev/null +++ b/climbing-stairs/sangyyypark.java @@ -0,0 +1,30 @@ +/** + 1. 문제 이해 + N이 주어지면 1부터 N까지의 숫자를 이용해서 N까지 도달 가능한 경우의 수(+1,+2만 가능)를 반환해야 하는 문제임. 중복을 허용하는 순열을 찾는 문제이다. + + 2. naive algorithm 도출 + 피보나치 수열임. + N=1일때 가능한 경우의 수는 1 + N=2일때 가능한 경우의 수는 2 + N=3일때 가능한 경우의 수는 3 (n-2번째와 n-1번째의 합) + + 3. 시간복잡도 분석 + + O(N) + 4. 코드작성 + */ +class sangyyypark { + public int climbStairs(int n) { + if(n ==1) return 1; + if(n==2) return 2; + int [] dp = new int[n+1]; + dp[0] = 0; + dp[1] = 1; + dp[2] = 2; + for(int i = 3; i <= n; i++) { + dp[i] = dp[i-2] + dp[i-1]; + } + return dp[n]; + } +} + diff --git a/product-of-array-except-self/sangyyypark.java b/product-of-array-except-self/sangyyypark.java new file mode 100644 index 0000000000..b4e37f23d3 --- /dev/null +++ b/product-of-array-except-self/sangyyypark.java @@ -0,0 +1,36 @@ +/** + 1. 문제 이해 + answer[i] 에는 nums[i]를 제외한 나머지 수들을 모두 곱셈 했을때의 결과값이 들어가는 배열을 반환하는 문제 + + 2. naive algorithm도출 + + 가장 간단한 방법은 answer[i]에 값을 넣을때 nums배열을 탐색해서 nums[i]를 제외한 수를 곱셈해서 넣으면 끝이다. + 하지만, nums의 길이가 길면 시간복잡도가 O(N^2)이다. + + answer[i]에는 nums[i]의 왼쪼까지의 곱과 오른쪽 까지의 곱을 곱하면 끝이므로 + answer[i]에 nums[i]의 왼쪽까지 합을 넣어놓고 answer[i]에 nums[i]의 오른쪽가지의 곱을 곱한다. + + 3. 시간복잡도 분석 + + 4. 코드구현 + */ +class sangyyypark { + public int[] productExceptSelf(int[] nums) { + int [] answer = new int[nums.length]; + + int left = 1; + for(int i = 0; i < nums.length; i++) { + answer[i] = left; + left = nums[i] * left; + } + + int right = 1; + for(int i = nums.length - 1; i >= 0; i--) { + answer[i] = answer[i] * right; + right = nums[i] * right; + } + return answer; + } + +} +