Skip to content

Commit 8be0726

Browse files
authored
Merge pull request #2245 from haxr369/main
[haxr369] WEEK 08 solutions
2 parents 2326b0c + 083dd82 commit 8be0726

4 files changed

Lines changed: 343 additions & 0 deletions

File tree

โ€Žclone-graph/haxr369.javaโ€Ž

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
/**
5+
* Runtime: 25 ms (Beats 72.12%)
6+
* Memory: 44.35 MB (Beats 34.32%)
7+
* Space Complexity: O(N)
8+
* - ๋ชจ๋“  ๋…ธ๋“œ ์ €์žฅ => O(N)
9+
* - visited๋กœ ๋ณต์‚ฌํ–ˆ๋˜ ๋…ธ๋“œ ๊ด€๋ฆฌ => O(N)
10+
* > O(N)
11+
* Time Complexity: O(N)
12+
* - ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€ ํ•œ๋ฒˆ์”ฉ ํƒ์ƒ‰ => O(N)
13+
* > O(N)
14+
*
15+
*/
16+
17+
class Node {
18+
public int val;
19+
public List<Node> neighbors;
20+
21+
public Node() {
22+
val = 0;
23+
neighbors = new ArrayList<Node>();
24+
}
25+
26+
public Node(int _val) {
27+
val = _val;
28+
neighbors = new ArrayList<Node>();
29+
}
30+
31+
public Node(int _val, ArrayList<Node> _neighbors) {
32+
val = _val;
33+
neighbors = _neighbors;
34+
}
35+
}
36+
37+
class Solution {
38+
public Node cloneGraph(Node node) {
39+
if (node == null) {
40+
return node;
41+
}
42+
43+
if (node.neighbors == null) {
44+
Node newNode = new Node(node.val, null);
45+
return newNode;
46+
} else if (node.neighbors.isEmpty()) {
47+
Node newNode = new Node(node.val, new ArrayList<>());
48+
return newNode;
49+
}
50+
51+
Node[] visited = new Node[104];
52+
53+
Node ans = new Node(node.val, new ArrayList<>(node.neighbors));
54+
visited[ans.val] = ans;
55+
dfs(ans, visited);
56+
57+
return ans;
58+
}
59+
60+
/**
61+
* node์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ dfs๋กœ ๋ณ€๊ฒฝํ•ด๊ฐ„๋‹ค.
62+
* ๋‹ค๋งŒ, ๋ณ€๊ฒฝํ–ˆ๋˜ ๋…ธ๋“œ๋Š” ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ
63+
*/
64+
private void dfs(Node node, Node[] visited) {
65+
66+
List<Node> neighbors = node.neighbors; // ์ด์ „ ๊ฒƒ
67+
68+
List<Node> newNeighbors = new ArrayList<>(); // ์ƒˆ ๊ป์งˆ
69+
// ํ•˜๋‚˜์”ฉ ์ƒˆ๊ฑธ๋กœ ๋ฐ”๊พธ์ž
70+
for (Node n : neighbors) {
71+
if (visited[n.val] != null) {
72+
newNeighbors.add(visited[n.val]);
73+
continue;
74+
}
75+
Node newN = new Node(n.val, new ArrayList<>(n.neighbors)); // ๊ป์งˆ ๋งŒ๋“ค๊ธฐ
76+
visited[newN.val] = newN;
77+
dfs(newN, visited); //
78+
newNeighbors.add(newN);
79+
}
80+
node.neighbors = newNeighbors; // ์‹ ๊ทœ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ
81+
// printNode(node);
82+
}
83+
84+
private void printNode(Node node) {
85+
System.out.print("val -> " + node.val);
86+
System.out.println(" size -> " + node.neighbors.size());
87+
node.neighbors.forEach(n -> System.out.print(n.val));
88+
System.out.print('\n');
89+
}
90+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.util.HashMap;
2+
import java.util.Iterator;
3+
import java.util.Map;
4+
5+
/**
6+
* Runtime: 105 ms (Beats 5.05%)
7+
* Memory: 46.94 MB (Beats 25.55%)
8+
* Space Complexity: O(1)
9+
* > 26๊ฐœ ์˜๋ฌธ์ž์— ๋Œ€ํ•œ Hash ํ…Œ์ด๋ธ” => O(26) => O(1)
10+
* Time Complexity: O(N)
11+
* - ์œˆ๋„์šฐ๋ฅผ ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ์ด๋™์‹œํ‚ค๊ธฐ => O(N)
12+
* - ์œˆ๋„์šฐ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์†Œ๋ณ€๊ฒฝํ•„์š”๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ => O(26) => O(1)
13+
* > O(N)xO(1) => O(N)
14+
*
15+
*/
16+
class Solution {
17+
/**
18+
* ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ธฐ๋ฒ• ์‚ฌ์šฉ
19+
*
20+
* 1. ์‹œ์ž‘์ธ๋ฑ์Šค, ์ข…๋ฃŒ์ธ๋ฑ์Šค ์„ค์ •.
21+
* 2. ์œˆ๋„์šฐ ์•ˆ์— ๋ณ€๊ฒฝ ํ•„์š” ๊ฑด์ˆ˜๊ฐ€ k ๋ณด๋‹ค ํฌ๋ฉด ์‹œ์ž‘์ธ๋ฑ์Šค ๋Š˜๋ฆฌ๊ธฐ => ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
22+
* 3. ๋งŒ์•ฝ ๋ณ€๊ฒฝ ํ•„์š” ๊ฑด์ˆ˜๊ฐ€ k์™€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ์ข…๋ฃŒ์ธ๋ฑ์Šค ๋Š˜๋ฆฌ๊ธฐ => ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ์œ ํšจํ•œ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ
23+
*/
24+
public int characterReplacement(String s, int k) {
25+
int strIdx = 0;
26+
int endIdx = 0;
27+
int visited = -1; // visited ๋ฌธ์ž๊นŒ์ง€๋Š” ์œˆ๋„์šฐ์— ๋“ค์–ด๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
28+
int ans = 0;
29+
30+
// ์œˆ๋„์šฐ ์ƒํƒœ ๊ด€๋ฆฌ
31+
Map<Character, Integer> winState = new HashMap<>();
32+
33+
while (s.length() > endIdx) {
34+
35+
// endC๋ฅผ ์œˆ๋„์šฐ์— ์ถ”๊ฐ€ํ•˜๊ธฐ
36+
if (visited < endIdx) { // ๋‘๋ฒˆ ๋„ฃ์ง€ ์•Š๊ฒŒ ๋ฐฉ์–ด๋ง‰ ์ณ์ฃผ๊ธฐ
37+
Character endC = Character.valueOf(s.charAt(endIdx));
38+
int temp = winState.getOrDefault(endC, 0);
39+
winState.put(endC, temp + 1);
40+
visited++;
41+
}
42+
43+
// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๊ธฐ O(26)
44+
int minChng = cntMinChng(winState, endIdx - strIdx + 1);
45+
if (minChng <= k) { // ์œ ํšจํ•œ ์ƒํƒœ
46+
ans = Integer.max(ans, endIdx - strIdx + 1);
47+
endIdx++;
48+
} else { // ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ
49+
Character strC = Character.valueOf(s.charAt(strIdx));
50+
// ๋’ท์ž๋ฆฌ ํ•˜๋‚˜ ๋นผ๊ธฐ
51+
int temp = winState.getOrDefault(strC, 0);
52+
winState.put(strC, temp - 1);
53+
strIdx++;
54+
}
55+
}
56+
return ans;
57+
}
58+
59+
/**
60+
* ์‹œ๊ฐ„๋ณต์žก๋„ => O(26)
61+
* ์œˆ๋„์šฐ์—์„œ ์ตœ์†Œ๋ณ€๊ฒฝํ•„์š”๊ฐœ์ˆ˜ ์นด์šดํŠธ
62+
* ๋ณ€๊ฒฝํ•ด์•ผํ•  ์ตœ์†Œ ๊ฐ’ = ํ˜„์žฌ ์œˆ๋„์šฐ ๊ธธ์ด - (๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž ๊ฐœ์ˆ˜)
63+
*/
64+
private int cntMinChng(Map<Character, Integer> winState, int winLen) {
65+
int minChng = Integer.MAX_VALUE;
66+
Iterator<Map.Entry<Character, Integer>> it = winState.entrySet().iterator();
67+
// ๋น„์–ด ์žˆ๋‹ค๋ฉด 0๊ฐœ๋กœ ์ถœ๋ ฅ
68+
if (!it.hasNext()) {
69+
return 0;
70+
}
71+
72+
// ๋ญ”๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ๋ฆฌ๊ธฐ
73+
while (it.hasNext()) {
74+
Map.Entry<Character, Integer> entry = it.next();
75+
int v = entry.getValue();
76+
int chng = winLen - v;
77+
minChng = Integer.min(chng, minChng);
78+
}
79+
return minChng;
80+
}
81+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
import java.util.Queue;
6+
7+
class Solution {
8+
9+
private final int[] dy = { -1, 1, 0, 0 };
10+
private final int[] dx = { 0, 0, -1, 1 };
11+
private int M = 0, N = 0;
12+
13+
/**
14+
* ํŠน์ • ๋…ธ๋“œ์—์„œ ์‹œ์ž‘์—์„œ ์ด์›ƒ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‘ ๋ฐ”๋‹ค๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ
15+
* ํŠน์ • ๋…ธ๋“œ์—์„œ ์ „์ฒด ํƒ์ƒ‰? => O(NxM) x O(NxM) ํƒ์ƒ‰ ํ•„์š”.
16+
*
17+
* ๊ทธ๋Ÿผ ํƒœํ‰์–‘, ๋Œ€์„œ์–‘ ๊ฐ๊ฐ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ ์ฐพ๊ธฐ(๋ณธ์ธ ์ด์ƒ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋กœ ํƒ์ƒ‰)
18+
* ๊ทธ๋ฆฌ๊ณ  ๊ฒน์น˜๋Š” ์ง€์  ์ฐพ๊ธฐ => ๋‹ต
19+
* 3xO(NxM)
20+
*
21+
* Runtime: 11 ms (Beats 28.23%)
22+
* Memory: 46.9 MB (Beats 98.39%)
23+
* Space Complexity: O(NxM)
24+
* - ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ flowed O(NxM)
25+
* - ๋ฐฉ๋ฌธํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์ฐพ๊ธฐ qu O(NxM)
26+
* > 2O(NxM) => O(NxM)
27+
* Time Complexity: O(NxM)
28+
* - ํƒœํ‰์–‘ ์ธ์ ‘ ๋…ธ๋“œ ํƒ์ƒ‰ O(NxM)
29+
* - ๋Œ€์„œ์–‘ ์ธ์ ‘ ๋…ธ๋“œ ํƒ์ƒ‰ O(NxM)
30+
* - ๋‘ ๋Œ€์–‘ ์ธ์ ‘ ๋…ธ๋“œ ๊ฒ€์ƒ‰ O(NxM)
31+
* > 3O(NxM)
32+
*/
33+
public List<List<Integer>> pacificAtlantic(int[][] heights) {
34+
M = heights.length;
35+
N = heights[0].length;
36+
int[][] flowed = new int[M][N]; // 1์ด๋ฉด ํƒœํ‰์–‘ ์ธ์ ‘, 2๋ฉด ๋Œ€์„œ์–‘, 3์ด๋ฉด ๋‘˜ ๋‹ค, 0์ด๋ฉด ์ธ์ ‘X
37+
38+
// (0,0) ~ (0,N-1)์„ 1๋กœ ๋„ฃ๊ณ  bfs ๋Œ๋ฆฌ๊ธฐ
39+
Queue<int[]> qu = new LinkedList<>();
40+
for (int i = 0; i < N; i++) {
41+
int[] temp = { 0, i };
42+
flowed[0][i] += 1;
43+
qu.add(temp);
44+
}
45+
// (1, 0) ~ (M-1, 0)
46+
for (int i = 1; i < M; i++) {
47+
int[] temp = { i, 0 };
48+
flowed[i][0] += 1;
49+
qu.add(temp);
50+
}
51+
// ํƒœํ‰์–‘ ํƒ์ƒ‰
52+
bfs(qu, flowed, heights, 1);
53+
54+
// printMp(flowed);
55+
56+
// System.out.println("------------");
57+
58+
qu = new LinkedList<>();
59+
// (M-1, 0) ~ (M-1, N-1)
60+
for (int i = 0; i < N; i++) {
61+
int[] temp = { M - 1, i };
62+
flowed[M - 1][i] += 2;
63+
qu.add(temp);
64+
}
65+
// (0, 0) ~ (M-2, N-1)
66+
for (int i = 0; i < M - 1; i++) {
67+
int[] temp = { i, N - 1 };
68+
flowed[i][N - 1] += 2;
69+
qu.add(temp);
70+
}
71+
// ํƒœํ‰์–‘ ํƒ์ƒ‰
72+
bfs(qu, flowed, heights, 2);
73+
List<List<Integer>> ans = new ArrayList<>();
74+
75+
for (int i = 0; i < M; i++) {
76+
for (int j = 0; j < N; j++) {
77+
if (flowed[i][j] == 3) {
78+
List<Integer> tmp = new ArrayList<>(Arrays.asList(i, j));
79+
ans.add(tmp);
80+
}
81+
}
82+
}
83+
84+
return ans;
85+
86+
}
87+
88+
private void bfs(Queue<int[]> qu, int[][] flowed, int[][] heights, int oceanTp) {
89+
while (!qu.isEmpty()) {
90+
int[] node = qu.poll();
91+
int h = heights[node[0]][node[1]];
92+
93+
// ์‚ฌ๋ฐฉ์„ ๋ณด๋ฉด์„œ ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๊ธฐ
94+
for (int n = 0; n < 4; n++) {
95+
int ny = node[0] + dy[n];
96+
int nx = node[1] + dx[n];
97+
98+
// ์„ฌ ๋ฐ– ์œ„์น˜์ธ์ง€ ์ฒดํฌ
99+
if (ny < 0 || ny >= M || nx < 0 || nx >= N) {
100+
continue;
101+
}
102+
// ๋ฐฉ๋ฌธํ–ˆ๋˜ ์œ„์น˜๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
103+
if (flowed[ny][nx] >= oceanTp) {
104+
continue;
105+
}
106+
// ๋ฐ”๋‹ค์—์„œ ์„ฌ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์ธ์ง€ ์ฒดํฌ
107+
if (h > heights[ny][nx]) {
108+
continue;
109+
}
110+
flowed[ny][nx] += oceanTp;
111+
int[] temp = { ny, nx };
112+
qu.add(temp);
113+
}
114+
}
115+
}
116+
117+
private void printMp(int[][] mp) {
118+
int my = mp.length;
119+
int mx = mp[0].length;
120+
for (int y = 0; y < my; y++) {
121+
for (int x = 0; x < mx; x++) {
122+
System.out.print(mp[y][x] + " ");
123+
}
124+
System.out.print('\n');
125+
}
126+
}
127+
}

โ€Žreverse-bits/haxr369.javaโ€Ž

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
class Solution {
2+
/**
3+
* Runtime: 1 ms (Beats 54.22%)
4+
* Memory: 42.34 MB (Beats 63.68%)
5+
* Space Complexity: O(1)
6+
* > ๊ณ ์ •๋œ 32byte ๋ฐฐ์—ด ์‚ฌ์šฉ์œผ๋กœ O(1)
7+
* Time Complexity: O(logN)
8+
* - n์˜ 2์ง„์ˆ˜ ๋ณ€ํ™˜ => O(logN)
9+
* - 32bit ์—ญ์ˆœ ๋ณ€ํ™˜ => O(1)
10+
* > O(log32) + O(1) => O(log32) ์‚ฌ์‹ค์ƒ O(1)
11+
*
12+
*/
13+
public int reverseBits(int n) {
14+
byte[] binarys = new byte[32];
15+
int temp = n;
16+
17+
// n์˜ 2์ง„์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ
18+
int i = 0;
19+
while (temp > 0) { // ์ตœ์ข… 0์ด๋˜๋ฉด ์ข…๋ฃŒ
20+
// ์ง์ˆ˜์ธ ๊ฒฝ์šฐ i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 0
21+
if (temp % 2 == 0) {
22+
binarys[i] = 0;
23+
} else { // ํ™€์ˆ˜๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 1
24+
binarys[i] = 1;
25+
temp -= 1;
26+
}
27+
temp = temp / 2;
28+
i++; // ๋น„ํŠธ์ˆ˜ ์˜ฌ๋ฆฌ๊ธฐ
29+
}
30+
31+
// ์ €์žฅ๋œ ๋น„ํŠธ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์‹ญ์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
32+
int ans = 0; // ์ดํ•ฉ์‚ฐ
33+
int base = 1; // i-j๋ฒˆ์งธ 2์ง„์ˆ˜ ๊ฐ’
34+
int j = 0;
35+
while (31 >= j) {
36+
// 2์ง„์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋งŒ ํ•ฉ์‚ฐํ•œ๋‹ค.
37+
if (binarys[31 - j] == 1) {
38+
ans += base;
39+
}
40+
base *= 2;
41+
j++;
42+
}
43+
return ans;
44+
}
45+
}

0 commit comments

Comments
ย (0)