Skip to content

Commit 3c451c0

Browse files
authored
Merge pull request #1121 from imsosleepy/main
[Ackku] week 15
2 parents e41d739 + 30f0ca6 commit 3c451c0

File tree

5 files changed

+197
-0
lines changed

5 files changed

+197
-0
lines changed

alien-dictionary/imsosleepy.java

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// 처음 봤을 때는 단순 노가다라 생각했는데, prefix 문제가 너무 까다로웠음
2+
// 사이클 탐지도 마지막에 두면 더 편했는데 코드가 너무 길어지는거 같아서 GPT의 도움을 받았다.
3+
// 다 정리하고 ㅂ니 코드 자체는 어렵지 않았음.
4+
// 코치 여러분, 그리고 스터디 참여한 모두 수고하셨습니다.
5+
public class AlienDictionary {
6+
public String alienOrder(String[] words) {
7+
Map<Character, Set<Character>> graph = new HashMap<>();
8+
Map<Character, Integer> inDegree = new HashMap<>();
9+
10+
for (String word : words) {
11+
for (char c : word.toCharArray()) {
12+
graph.putIfAbsent(c, new HashSet<>());
13+
inDegree.putIfAbsent(c, 0);
14+
}
15+
}
16+
17+
for (int i = 0; i < words.length - 1; i++) {
18+
String first = words[i];
19+
String second = words[i + 1];
20+
21+
// invalid case: prefix 문제
22+
if (first.length() > second.length() && first.startsWith(second)) {
23+
return "";
24+
}
25+
26+
for (int j = 0; j < Math.min(first.length(), second.length()); j++) {
27+
char c1 = first.charAt(j);
28+
char c2 = second.charAt(j);
29+
if (c1 != c2) {
30+
if (!graph.get(c1).contains(c2)) {
31+
graph.get(c1).add(c2);
32+
inDegree.put(c2, inDegree.get(c2) + 1);
33+
}
34+
break;
35+
}
36+
}
37+
}
38+
39+
PriorityQueue<Character> pq = new PriorityQueue<>();
40+
for (char c : inDegree.keySet()) {
41+
if (inDegree.get(c) == 0) {
42+
pq.offer(c);
43+
}
44+
}
45+
46+
StringBuilder result = new StringBuilder();
47+
while (!pq.isEmpty()) {
48+
char current = pq.poll();
49+
result.append(current);
50+
for (char neighbor : graph.get(current)) {
51+
inDegree.put(neighbor, inDegree.get(neighbor) - 1);
52+
if (inDegree.get(neighbor) == 0) {
53+
pq.offer(neighbor);
54+
}
55+
}
56+
}
57+
58+
// invalid case: 사이클 문제
59+
if (result.length() != inDegree.size()) {
60+
return "";
61+
}
62+
63+
return result.toString();
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// 투포인터와 유사한 방식의 풀이가 하나 더 있었음
2+
// 다만 모든 문자열이 가운데가 될 수 있다는 조건이 너무 까다로워서 구현에는 실패함
3+
// DP와 같은 O(N^2)이 되지만 공간사용량이 압도적으로 적어서 시간차이가 많이 나게 됨
4+
// GPT의 도움을 받았음
5+
class Solution {
6+
public String longestPalindrome(String s) {
7+
if (s == null || s.length() < 1) return "";
8+
9+
int start = 0, end = 0;
10+
11+
for (int i = 0; i < s.length(); i++) {
12+
int len1 = expandAroundCenter(s, i, i);
13+
int len2 = expandAroundCenter(s, i, i + 1);
14+
int len = Math.max(len1, len2);
15+
16+
17+
if (len > end - start) {
18+
start = i - (len - 1) / 2;
19+
end = i + len / 2;
20+
}
21+
}
22+
23+
return s.substring(start, end + 1);
24+
}
25+
26+
private int expandAroundCenter(String s, int left, int right) {
27+
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
28+
left--;
29+
right++;
30+
}
31+
return right - left - 1;
32+
}
33+
}
34+
35+
// 가장 먼저 생각한 풀이. 회문하면 떠오르는게 DP인데 이런 방식을 바라는게 아닌거같음
36+
class Solution {
37+
public String longestPalindrome(String s) {
38+
int n = s.length();
39+
boolean[][] dp = new boolean[n][n];
40+
41+
int start = 0, maxLen = 1;
42+
43+
// 길이가 1인 경우
44+
for (int i = 0; i < n; i++) {
45+
dp[i][i] = true;
46+
}
47+
48+
// 길이가 2인 경우
49+
for (int i = 0; i < n - 1; i++) {
50+
if (s.charAt(i) == s.charAt(i + 1)) {
51+
dp[i][i + 1] = true;
52+
start = i;
53+
maxLen = 2;
54+
}
55+
}
56+
57+
for (int len = 3; len <= n; len++) {
58+
for (int i = 0; i <= n - len; i++) {
59+
int j = i + len - 1;
60+
61+
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
62+
dp[i][j] = true;
63+
start = i;
64+
maxLen = len;
65+
}
66+
}
67+
}
68+
69+
return s.substring(start, start + maxLen);
70+
}
71+
}

rotate-image/imsosleepy.java

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// You have to rotate the image in-place 라는말을 별 생각 안하고 풀다가 오래걸림
2+
// "matrix내"에서 문제의 요구사항 대로 회전시켜줘야 한다. 유지해야한다
3+
// matrix[i][j]를 matrix[j][i]로 바꾸고 각 행을 좌우로 뒤집는다.
4+
class Solution {
5+
public void rotate(int[][] matrix) {
6+
int n = matrix.length;
7+
8+
for (int i = 0; i < n; i++) {
9+
for (int j = i + 1; j < n; j++) {
10+
int temp = matrix[i][j];
11+
matrix[i][j] = matrix[j][i];
12+
matrix[j][i] = temp;
13+
}
14+
}
15+
16+
for (int i = 0; i < n; i++) {
17+
for (int j = 0; j < n / 2; j++) {
18+
int temp = matrix[i][j];
19+
matrix[i][j] = matrix[i][n - 1 - j];
20+
matrix[i][n - 1 - j] = temp;
21+
}
22+
}
23+
}
24+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// 이지문제가 아닌거 같다. 루트 노드를 반복 검증해야하는데 방법을 못 찾아서 오래걸림
2+
// 시간 복잡도는 O(root의 길이*subRoot의 길이)
3+
class Solution {
4+
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
5+
if (root == null) return false;
6+
7+
if (isSameTree(root, subRoot)) return true;
8+
9+
return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
10+
}
11+
12+
private boolean isSameTree(TreeNode a, TreeNode b) {
13+
if (a == null && b == null) return true; // 둘 다 null이면 같음
14+
if (a == null || b == null) return false; // 하나만 null이면 다름
15+
if (a.val != b.val) return false; // 값이 다르면 다름
16+
17+
// DFS로 지속 검증
18+
return isSameTree(a.left, b.left) && isSameTree(a.right, b.right);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// 이진 탐색트리는 보통 O(N) ~ O(NlogN)을 요구한다.
2+
// 그래서 이번에도 모든 노드를 한번만 탐색하는게 목표
3+
// Node.val의 숫자 크기 때문에 Max_VALUE를 잘 지정해주면 바로 풀림
4+
class Solution {
5+
public boolean isValidBST(TreeNode root) {
6+
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
7+
}
8+
9+
private boolean isValidBST(TreeNode node, long min, long max) {
10+
if (node == null) return true;
11+
12+
if (node.val <= min || node.val >= max) return false;
13+
14+
return isValidBST(node.left, min, node.val) &&
15+
isValidBST(node.right, node.val, max);
16+
}
17+
}

0 commit comments

Comments
 (0)