Skip to content

Commit 5f31403

Browse files
authored
Merge pull request #1212 from Tessa1217/main
[Tessa1217] Week 02 solutions
2 parents fb9b463 + 95ce67e commit 5f31403

File tree

5 files changed

+211
-0
lines changed

5 files changed

+211
-0
lines changed

3sum/Tessa1217.java

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.List;
2+
import java.util.ArrayList;
3+
import java.util.Arrays;
4+
5+
// 정수 배열 nums가 주어질 때 nums[i], nums[j], nums[k]로 이루어진 배열을 반환하시오
6+
// 반환 배열 조건: i 가 j와 같지 않고, i가 k와 같지 않으며 세 요소의 합이 0인 배열
7+
class Solution {
8+
9+
// 시간복잡도: O(n^2)
10+
public List<List<Integer>> threeSum(int[] nums) {
11+
12+
Arrays.sort(nums);
13+
14+
List<List<Integer>> answer = new ArrayList<>();
15+
16+
int left = 0;
17+
int right = 0;
18+
int sum = 0;
19+
20+
for (int i = 0; i < nums.length - 2 && nums[i] <= 0; i++) {
21+
22+
// 중복 제거
23+
if (i > 0 && nums[i] == nums[i - 1]) {
24+
continue;
25+
}
26+
27+
left = i + 1;
28+
right = nums.length - 1;
29+
30+
while (left < right) {
31+
32+
sum = nums[i] + nums[left] + nums[right];
33+
// System.out.println(String.format("%d, %d, %d", i, left, right));
34+
// System.out.println(String.format("%d + %d + %d = %d", nums[i], nums[left], nums[right], sum));
35+
if (sum < 0) {
36+
left++;
37+
continue;
38+
}
39+
if (sum > 0) {
40+
right--;
41+
continue;
42+
}
43+
44+
answer.add(List.of(nums[i], nums[left], nums[right]));
45+
46+
// 중복 제거
47+
while (left < right && left + 1 < nums.length && nums[left] == nums[left + 1]) {
48+
left++;
49+
}
50+
while (left < right && right - 1 >= 0 && nums[right] == nums[right - 1]) {
51+
right--;
52+
}
53+
left++;
54+
right--;
55+
56+
}
57+
}
58+
59+
return answer;
60+
}
61+
62+
}
63+

climbing-stairs/Tessa1217.java

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
당신은 계단을 오르고 있다. 정상에 오르기까지 n 계단을 올라야 한다.
3+
계단을 오를 때마다 1 계단 또는 2 계단씩 오를 수 있을 때 정상에 도달하기까지의 경우의 수를 구하시오.
4+
*/
5+
6+
public class Solution {
7+
8+
// 시간복잡도: O(n)
9+
public int climbStairs(int n) {
10+
11+
if (n == 1 || n == 2) {
12+
return n;
13+
}
14+
15+
int[] cases = new int[n + 1];
16+
cases[1] = 1;
17+
cases[2] = 2;
18+
for (int i = 3; i <= n; i++) {
19+
cases[i] = cases[i - 1] + cases[i - 2];
20+
}
21+
22+
return cases[n];
23+
}
24+
25+
}
26+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
정수 배열 nums가 주어질 때 answer[i]가 nums[i]를 제외한 나머지 요소의 곱인 answer 배열을 반환하시오.
3+
*/
4+
public class Solution {
5+
6+
/** 시간복잡도 O(n) */
7+
public int[] productExceptSelf(int[] nums) {
8+
9+
int[] answer = new int[nums.length];
10+
11+
int start = 1;
12+
for (int i = 0; i < nums.length; i++) {
13+
answer[i] = start;
14+
start *= nums[i];
15+
}
16+
17+
int end = 1;
18+
for (int i = nums.length - 1; i >= 0; i--) {
19+
answer[i] *= end;
20+
end *= nums[i];
21+
}
22+
23+
return answer;
24+
}
25+
}
26+

valid-anagram/Tessa1217.java

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
두 문자열 s와 t가 주어질 때 t가 s의 애너그램이라면 true, 아니면 false를 반환하세요.
3+
*/
4+
5+
import java.util.Map;
6+
import java.util.HashMap;
7+
import java.util.Arrays;
8+
public class Solution {
9+
10+
// 2차 풀이 (맵 활용하여 시간 복잡도 줄이기, 시간복잡도: O(n))
11+
public boolean isAnagram(String s, String t) {
12+
13+
Map<Character, Integer> charMap = new HashMap<>();
14+
15+
char[] sArr = s.toCharArray();
16+
for (char sa : sArr) {
17+
charMap.put(sa, charMap.getOrDefault(sa, 0) + 1);
18+
}
19+
20+
char[] tArr = t.toCharArray();
21+
for (char ta : tArr) {
22+
charMap.put(ta, charMap.getOrDefault(ta, 0) - 1);
23+
}
24+
25+
for (int cnt : charMap.values()) {
26+
if (cnt != 0) {
27+
return false;
28+
}
29+
}
30+
31+
return true;
32+
33+
}
34+
35+
36+
// 1차 풀이 (정렬로 인해 O(n log n))
37+
// public boolean isAnagram(String s, String t) {
38+
//
39+
// if (s.length() != t.length()) {
40+
// return false;
41+
// }
42+
//
43+
// char[] sArr = s.toCharArray();
44+
// char[] tArr = t.toCharArray();
45+
//
46+
// Arrays.sort(sArr);
47+
// Arrays.sort(tArr);
48+
//
49+
// for (int i = 0; i < sArr.length; i++) {
50+
// if (sArr[i] != tArr[i]) {
51+
// return false;
52+
// }
53+
// }
54+
//
55+
// return true;
56+
//
57+
// }
58+
59+
}
60+
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
/**
17+
이진 트리의 root가 주어졌을 때 유효한 이진 탐색 트리인지 검증하세요.
18+
*/
19+
class Solution {
20+
21+
/** 시간복잡도 O(n) */
22+
public boolean isValidBST(TreeNode root) {
23+
return isValidRange(root, Long.MIN_VALUE, Long.MAX_VALUE);
24+
}
25+
26+
private boolean isValidRange(TreeNode root, long min, long max) {
27+
if (root == null) {
28+
return true;
29+
}
30+
if (root.val <= min || root.val >= max) {
31+
return false;
32+
}
33+
return isValidRange(root.left, min, root.val) && isValidRange(root.right, root.val, max);
34+
}
35+
}
36+

0 commit comments

Comments
 (0)