Skip to content
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
27 changes: 27 additions & 0 deletions contains-duplicate/sangyyypark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* 1 .문제 정의
* 배열이 주어지면, 배열에 포함된 정수가 중복이 없다면 fasle, 적어도 1회 이상 중복이 있다면 true를 반환해야한다.
* 배열의 크기는?
* - 1 <= length <= 100000
* 2. naive algorithm 도출
* - 배열을 탐색하면서 Set자료구조에 넣는다. 이때 Set에 넣으려는 값이 이미 포함되어있는지를 확인합니다.. true를 반환.
* - 배열 전체를 탐색했는데 포함여부에서 걸리지 않으면 false를 반환
* 3. 시간&공간복잡도 분석
* - 배열의 길이가 N이면 O(N)의 시간 복잡도
* 4. 코드작성
*/
import java.util.*;
public class sangyyypark {
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
int value = nums[i];
if(set.contains(value)) {
return true;
}
set.add(value);
}
return false;
}
}

40 changes: 40 additions & 0 deletions house-robber/sangyyypark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/**
배열은 강도가 털 집의 돈을 순서대로 나타냅니다.
*
* 인접한 두 집을 동시에 털면 경찰에 알림이 가기 때문에 피해야 합니다.
*
* 하루에 훔칠 수 있는 가장 많은 돈을 구하는 문제입니다.
*
*
* 2. naive 알고리즘 도출
*
* - 현재 집을 털기 → 바로 이전 집은 못 털었으므로 prev2 + 현재집
* - 현재 집을 안 털기 → 이전까지의 최댓값 유지 prev1
*/
class sangyyypark {
public static int rob(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}


int prev2 = 0; // i-2번째 집까지의 최대 금액
int prev1 = 0; // i-1번째 집까지의 최대 금액

for (int num : nums) {
// 현재 집을 털 경우: prev2 + num
// 현재 집을 안 털 경우: prev1
int current = Math.max(prev1, prev2 + num);


prev2 = prev1;
prev1 = current;
}

return prev1;
}
}

37 changes: 37 additions & 0 deletions longest-consecutive-sequence/sangyyypark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@

import java.util.HashSet;
import java.util.Set;
/**
각 연속 수열의 시작점에서만 카운팅하기

1. 모든 숫자를 Set에 넣기
2. 배열을 탐색하면서 현재 index에 해당하는 숫자 -1 값이 Set에 존재하는지 확인
3. 만약 Set에 값이 존재한다면 연속된 숫자의 시작지점이 아니다.
4. 만약 Set에 값이 존재하지 않는다면 연속된 숫자의 시작지점이다.
5. 시작지점을 찾았으면 num + 1값이 존재하는지 확인, num+2값이 존재하는지 확인하면서 등장하지 않을때 까지 체크하고 길이를 최대 길이와 비교한다. (이때 배열을 기준으로 탐색하면 배열에 중복 숫자가 있을경우 매번 중복숫자에 대해서 length를 체크해야하므로 Set이 이득임)
*/
class sangyyypark {
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
int num = nums[i];
set.add(num);
}
int max = 0;

for(int num : set) {
if(set.contains(num-1)) {
continue;
}
int index = 1;
int length = 1;
while(set.contains(num+index)) {
index++;
length++;
}
max = Math.max(max,length);
}
return max;
}
}

50 changes: 50 additions & 0 deletions top-k-frequent-elements/sangyyypark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import java.util.*;
/**
* 1 .문제 정의

배열이 있는데 여기서 각 숫자가 등장한 빈도수를 체크하고 K번째 까지 높은 빈도로 등장한 수를 리턴하는 문제입니다.

- n의 길이는 1 ~ 10000

* 2. naive algorithm 도출

배열을 순회함면서 Map에 넣으면서 빈도수를 체크.
빈도수 계산이 끝나고 나면 빈도수를 기준으로 내림차순 정렬

*
* 3. 시간&공간복잡도 분석
* O(N) + O(M) + O(M log M) + O(K) = O(N + N log N) = O(N log N)

* 4. 코드작성
*/
class sangyyypark {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
int num = nums[i];
if(map.containsKey(num)) {
map.put(num, map.get(num) + 1);
}
else {
map.put(num,1);
}
}

List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return map.get(o2).compareTo(map.get(o1));
}
});

int [] result = new int[k];
int index = 0;
for(int i = 0; i < k; i++) {
result[index] = keySet.get(i);
index++;
}
return result;
}
}

59 changes: 59 additions & 0 deletions two-sum/sangyyypark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* 1 .문제 정의
* 배열이 주어지면, 배열에 포함된 정수가 중복이 없다면 fasle, 적어도 1회 이상 중복이 있다면 true를 반환해야한다.
* 배열의 크기는?
* - 1 <= length <= 100000
* 2. naive algorithm 도출
* - 배열을 탐색하면서 Set자료구조에 넣는다. 이때 Set에 넣으려는 값이 이미 포함되어있는지를 확인합니다.. true를 반환.
* - 배열 전체를 탐색했는데 포함여부에서 걸리지 않으면 false를 반환
* 3. 시간&공간복잡도 분석
* - 배열의 길이가 N이면 O(N)의 시간 복잡도
* 4. 코드작성
*/
import java.util.*;

/**
* 1 .문제 정의
* 배열에서 동일한 숫자를 사용하지 않고 두개의 숫자를 선택해서 합이 target이 나오는지 판별해야 하는 문제
* - 배열의 길이는?
* - 2 <= length <= 10000 라고 가정합니다.
* - target을 만드는 경우가 여러개가 있다면?
* - 오직 하나의 경우만 있다고 가정합니다.
* 2. naive algorithm 도출
* - 투포인터 알고리즘을 사용해서 구현
* - left,right를 각각 선정합니다.
* - left와 right가 같으면 합을 구하지 않고 Right를 1칸 전진합니다.
* - left와 right의 합을 구해서 target이 아니라면 right를 1칸 전진합니다.
* - right가 마지막에 도달했는데도 target이 아니라면 left를 1칸 전진합니다.
* - 위 과정을 반복합니다.
* 3. 시간&공간복잡도 분석
* - 투포인터 알고리즘의 시간복잡도는 O(N^2)
* 4. 코드작성
*/
public class sangyyypark {
public int[] twoSum(int[] nums, int target) {
int left = 0;
int right = 1;
int [] answer = new int [2];
while(left < nums.length && right < nums.length) {
int a = nums[left];
int b = nums[right];
if(target == a + b) {
answer[0] = left;
answer[1] = right;
break;
}


if(right >= nums.length -1) {
left++;
right = left+1;
}
else {
right++;
}
}
return answer;
}
}