[dahyeong-yun] WEEK 09 Solutions - #2827
Conversation
๐ dahyeong-yun ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
linked-list-cycle/dahyeong-yun.java
/**
* TC : O(n)
* - ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ํ๋ฒ ์ํํ๋ฏ๋ก O(n)
* SC : O(n)
* - ์ต๋ n๊ฐ์ ๋
ธ๋๋ฅผ Set์ ์ ์ฅํ๋ฏ๋ก O(n)
*/
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> seen = new HashSet<>();
for(ListNode cur = head; cur !=null; cur = cur.next) {
if(!seen.add(cur)) return true;
}
return false;
}
}
/**
* TC : O(n)
* - fast๊ฐ slow๋ฅผ ๋ฐ๋ผ์ก์ ๋๊น์ง ์ต์
์ ๊ฒฝ์ฐ 2n๋ฒ ๋
ธ๋๋ฅผ ์ํํ๊ณ , slow๋ n๋ฒ ์ํํ๋ฏ๋ก O(n)
* SC : O(1)
* - slow, fast๊ฐ ๋ชจ๋ ํฌ์ธํฐ๋ง์ ์ฌ์ฉํ๋ฏ๋ก O(1)
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast) {
return true;
}
}
return false;
}
}- ํจํด: Hash Map / Hash Set, Two Pointers, Floydโs Cycle Detection
- ์ค๋ช : ์ฒซ ๋ฒ์งธ ํจ์๋ ํด์์ ์ผ๋ก ์ด๋ฏธ ๋ณธ ๋ ธ๋๋ฅผ ๊ธฐ์ตํ๋ Hash Map / Hash Set ํจํด์ ์ฌ์ฉํ๊ณ , ๋ ๋ฒ์งธ ํจ์๋ ๋๋ฆฐ ํฌ์ธํฐ์ ๋น ๋ฅธ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ Two Pointers(ํ๋ก์ด๋ ์ฌ์ดํด ๊ฒ์ถ) ๋ฐฉ์์ผ๋ก ์ํํ๋ฉฐ ์ํ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
โน๏ธ ์ด ํ์ผ์๋ 2๊ฐ์ง ํ์ด๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๊ฐ ๋ถ์ํฉ๋๋ค.
ํ์ด 1: Solution.hasCycle โ Time: โ
O(n) โ O(n) / Space: โ
O(n) โ O(n)
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(n) | O(n) | โ |
| Space | O(n) | O(n) | โ |
ํผ๋๋ฐฑ: ํด์ ์ธํธ๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ๊ธฐ๋กํ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ n๊ฐ์ ๋ ธ๋ ๊ณต๊ฐ์ด ํ์ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
ํ์ด 2: Solution.hasCycle โ Time: โ
O(n) โ O(n) / Space: โ
O(1) โ O(1)
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(n) | O(n) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ์ถ๊ฐ ์๋ฃ๊ตฌ์กฐ ์์ด ๊ณ ์ ๋ ๋ ํฌ์ธํฐ๋ง์ผ๋ก ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
maximum-product-subarray/dahyeong-yun.java
/**
* TC : O(n)
* - nums ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ์ํํ๋ฏ๋ก O(n)
* SC : O(1)
* - int ๋ณ์๋ง ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก O(1)
*/
class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
if(len == 1) return nums[0];
int answer = nums[0];
int max = nums[0];
int min = nums[0];
for(int i = 1; i < len; i++) {
int current = nums[i];
int productFromMax = max * nums[i];
int productFromMin = min * nums[i];
max = Math.max(Math.max(current, productFromMax), productFromMin);
min = Math.min(Math.min(current, productFromMax), productFromMin);
answer = Math.max(max, answer);
}
return answer;
}
}- ํจํด: Dynamic Programming, Bit Manipulation
- ์ค๋ช : ์ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ต๋ ๊ณฑ์ ํ์ฌ ์์น์์์ ์ต๋/์ต์ ๊ณฑ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก DP ํจํด์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ์คํ ์์ ์ต๋/์ต์ ๊ณฑ์ ํ๋ณด๋ฅผ ๋น๊ตํ์ฌ ์ ์งํ๋ฉฐ, ๋ถ๋ถ ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด ์ ์ฒด ํด๋ฅผ ๊ตฌํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(n) | O(n) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ํ์ฌ ๋ฐฐ์ด ๊ธธ์ด๋งํผ ์ํํ๊ณ ์์ ๊ณต๊ฐ์ผ๋ก ๋์ํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
pacific-atlantic-water-flow/dahyeong-yun.java
/**
* heights ์ ํ์ ๊ฐฏ์ m, ์ด์ ๊ฐฏ์๋ฅผ n ์ด๋ผ ํ ๋,
*
* TC : O
* - m * n ๋งํผ ์ํ ํ๋ฏ๋ก O(m * n)
* SC : O(m * n)
* - m * n ํฌ๊ธฐ์ boolean ๋ฐฐ์ด์ 2๊ฐ ์ฌ์ฉํ๋ฏ๋ก O(m * n)
*
*
* [์ต์
์ ์ฝ์คํ ๊น์ด O(m * n) ์์ ํ๋ ฌ (4x4, ์ด 16๊ฐ ์
)]
*
* ์ซ์๊ฐ 1๋ถํฐ 16๊น์ง 1์ฉ ์ฆ๊ฐํ๋ฉฐ ๋จ ํ๋์ ๊ฒฝ๋ก๋ก๋ง ์ด์ด์ง๋ ํํ:
*
* (0,0) [ 1] -> [ 2] -> [ 3] -> [ 4]
* |
* (1,0) [ 8] <- [ 7] <- [ 6] <- [ 5]
* |
* (2,0) [ 9] -> [10] -> [11] -> [12]
* |
* (3,0) [16] <- [15] <- [14] <- [13]
*
* - (0, 0)์์ Pacific DFS ์์ ์:
* 1 -> 2 -> 3 -> ... -> 15 -> 16 ๊น์ง ๋ฆฌํด ์์ด ๋จ์ผ ๊ฒฝ๋ก๋ก ์ญ ์ฌ๊ท ํธ์ถ๋จ.
* - ๊ฒฐ๊ณผ: 16(m * n)๊ฐ์ ํจ์ ํธ์ถ ํ๋ ์์ด ์คํ์ ๋์์ ์์ฌ ์ต๋ ๊น์ด ๋๋ฌ.
*/
class Solution {
int [][] heights;
int rowLimit = 0;
int colLimit = 0;
int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public List<List<Integer>> pacificAtlantic(int[][] heights) {
this.heights = heights;
this.rowLimit = heights.length;
this.colLimit = heights[0].length;
boolean[][] pacific = new boolean[rowLimit][colLimit];
boolean[][] atlantic = new boolean[rowLimit][colLimit];
for(int row = 0; row < rowLimit; row++) {
dfs(row, 0, heights[row][0], pacific);
dfs(row, colLimit - 1, heights[row][colLimit - 1], atlantic);
}
for(int col = 0; col < colLimit; col++) {
dfs(0, col, heights[0][col], pacific);
dfs(rowLimit - 1, col, heights[rowLimit - 1][col], atlantic);
}
List<List<Integer>> answer = new ArrayList<>();
for(int row = 0; row < rowLimit; row++) {
for(int col = 0; col < colLimit; col++) {
if(pacific[row][col] && atlantic[row][col]) {
List<Integer> comb = List.of(row, col);
answer.add(comb);
}
}
}
return answer;
}
public void dfs(int row, int col, int prevHeight, boolean[][] oceanFlag) {
if(row < 0 || col < 0 || row >= rowLimit || col >= colLimit) return;
if(oceanFlag[row][col] || this.heights[row][col] < prevHeight) return;
oceanFlag[row][col] = true;
for(int[] d : directions) {
dfs(row + d[0], col + d[1], this.heights[row][col], oceanFlag);
}
}
}- ํจํด: Depth-First Search, Backtracking
- ์ค๋ช : ์ฝ๋๋ ๊ฐ ๋ฐ๋ค์์ ๋๋ฌ ๊ฐ๋ฅํ ์นธ์ DFS๋ก ํ์ํ๊ณ , ๋ ํด์์ผ๋ก ์นจํฌ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ flags์ ํ์ํฉ๋๋ค. ์ฌ๊ท์ DFS ํธ์ถ ๋ฐ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ก ํ์ ๊ณต๊ฐ์ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | - | O(m * n) | - |
| Space | O(m * n) | O(m * n) | โ |
ํผ๋๋ฐฑ: ๊ฐ ์ ๋ง๋ค ํ ๋ฒ์ฉ DFS๊ฐ ํธ์ถ๋์ด ๊ฐ ๋ฐฉํฅ ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ค. ๋ ๋ฒ์ DFS ํ์์ผ๋ก ์ ์ฒด ๊ฒฉ์๋ฅผ ์ปค๋ฒํ๋ฏ๋ก ์๊ฐ๊ณผ ๊ณต๊ฐ ๋ณต์ก๋๋ ๊ฒฉ์ ํฌ๊ธฐ์ ๋น๋กํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
sum-of-two-integers/dahyeong-yun.java
/**
* TC : O(1)
* - carry๊ฐ ๋งค๋ฒ ๋ฐ์ํด๋ int primitives์ ๋นํธ ์๊ฐ 32์ด๋ฏ๋ก ์ต๋ 32๋ฒ ๋ฐ๋ณต
* SC : O(1)
*/
class Solution {
public int getSum(int a, int b) {
while(b != 0) {
int carry = (a & b) << 1;
a = a ^ b;
b = carry;
}
return a;
}
}- ํจํด: Bit Manipulation
- ์ค๋ช : ๋ ์ ์์ ํฉ์ ๋นํธ ์ฐ์ฐ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ก, ๋นํธ ์ฐ์ฐ์ผ๋ก ์๋ฆฌ ์ฌ๋ฆผ(carry)๊ณผ ํฉ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋นํธ ํจํด์ด๋ค. ๋ฐ๋ณต์ carry๊ฐ 0์ด ๋ ๋๊น์ง ์งํ๋๋ฉฐ, ๊ฒฐ๊ตญ ํฉ์ด ๋ง๋ค์ด์ง๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ์ ์ ๋ถ์ | ์ค์ ๋ถ์ | ๊ฒฐ๊ณผ | |
|---|---|---|---|
| Time | O(1) | O(1) | โ |
| Space | O(1) | O(1) | โ |
ํผ๋๋ฐฑ: ๋นํธ ์ฐ์ฐ๋ง์ผ๋ก ํฉ์ ๊ตฌํ๋ ๋ฃจํ๋ฅผ ์ฌ์ฉํ๊ณ , 32๋นํธ ์ ์ ํ๊ณ ๋ด์์ carry๊ฐ ๋๋๋๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
| * SC : O(1) | ||
| * - slow, fast๊ฐ ๋ชจ๋ ํฌ์ธํฐ๋ง์ ์ฌ์ฉํ๋ฏ๋ก O(1) | ||
| */ | ||
| public class Solution { |
There was a problem hiding this comment.
2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ณด์ ๊ฒ ์ข๋ค์!! ์ฝ๋๋ ๊น๋ํ๊ตฌ์ ๐
| class Solution { | ||
| public int maxProduct(int[] nums) { | ||
| int len = nums.length; | ||
| if(len == 1) return nums[0]; |
There was a problem hiding this comment.
์ด ์ฝ๋๊ฐ ์์ด๋ ์ด์ฐจํผ ๋ฐ๋ณต๋ฌธ์ ์๋๊ณ answer๊ฐ ๋ฐํ๋ ๊ฒ ๊ฐ์๋ฐ, ๊ตณ์ด ๋ฃ์ผ์ ์ด์ ๊ฐ ์์๊น์?
| int [][] heights; | ||
| int rowLimit = 0; | ||
| int colLimit = 0; |
There was a problem hiding this comment.
dfs์ ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
์ฝ๋ฉํ
์คํธ์์๋ ์๊ด์๊ฑฐ๋ ์กฐ๊ธ ๊ณผํ ์๋ ์์ ๊ฒ ๊ฐ๊ธด ํ๋ฐ,
- dfs๊ฐ ์ธ๋ถ ์ํ(this.heights ๋ฑ)์ ์์กดํ์ง ์๊ฒ ๋์ด์, ์ด Solution ์ธ์คํด์ค๊ฐ ์ฌ์ฌ์ฉ๋๊ฑฐ๋ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ํธ์ถ๋ ๋ ์ํ๊ฐ ๊ผฌ์ผ ์ํ์ด ์์ด์ง ๊ฒ ๊ฐ์ต๋๋ค.
- ๋ dfs ์๊ทธ๋์ฒ๋ง ๋ด๋ ์ด ํจ์๊ฐ ๋ญ ํ์๋ก ํ๋์ง ๋ฐ๋ก ๋๋ฌ๋์, ๋์ค์ ์ด ํจ์๋ง ๋ฐ๋ก ์ฝ๊ฑฐ๋ ํ ์คํธํ ๋๋ ๋ ํธํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋์ด๋๋ ํธ๋ ์ด๋์คํ๋ ์์ด์, ์ง๊ธ์ฒ๋ผ ์ฝ๋ฉํ ์คํธ์ฉ์ผ๋ก 1ํ์ฑ ๋ก์ง์ด๋ฉด ์ง๊ธ ๋ฐฉ์๋ ์ถฉ๋ถํ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค์!
| /** | ||
| * heights ์ ํ์ ๊ฐฏ์ m, ์ด์ ๊ฐฏ์๋ฅผ n ์ด๋ผ ํ ๋, | ||
| * | ||
| * TC : O | ||
| * - m * n ๋งํผ ์ํ ํ๋ฏ๋ก O(m * n) | ||
| * SC : O(m * n) | ||
| * - m * n ํฌ๊ธฐ์ boolean ๋ฐฐ์ด์ 2๊ฐ ์ฌ์ฉํ๋ฏ๋ก O(m * n) | ||
| * | ||
| * | ||
| * [์ต์ ์ ์ฝ์คํ ๊น์ด O(m * n) ์์ ํ๋ ฌ (4x4, ์ด 16๊ฐ ์ )] | ||
| * | ||
| * ์ซ์๊ฐ 1๋ถํฐ 16๊น์ง 1์ฉ ์ฆ๊ฐํ๋ฉฐ ๋จ ํ๋์ ๊ฒฝ๋ก๋ก๋ง ์ด์ด์ง๋ ํํ: | ||
| * | ||
| * (0,0) [ 1] -> [ 2] -> [ 3] -> [ 4] | ||
| * | | ||
| * (1,0) [ 8] <- [ 7] <- [ 6] <- [ 5] | ||
| * | | ||
| * (2,0) [ 9] -> [10] -> [11] -> [12] | ||
| * | | ||
| * (3,0) [16] <- [15] <- [14] <- [13] | ||
| * | ||
| * - (0, 0)์์ Pacific DFS ์์ ์: | ||
| * 1 -> 2 -> 3 -> ... -> 15 -> 16 ๊น์ง ๋ฆฌํด ์์ด ๋จ์ผ ๊ฒฝ๋ก๋ก ์ญ ์ฌ๊ท ํธ์ถ๋จ. | ||
| * - ๊ฒฐ๊ณผ: 16(m * n)๊ฐ์ ํจ์ ํธ์ถ ํ๋ ์์ด ์คํ์ ๋์์ ์์ฌ ์ต๋ ๊น์ด ๋๋ฌ. |
There was a problem hiding this comment.
์๊ณ ๋ฆฌ์ฆ ์ค๋ช ์ด ๋์ด์์ด ์ข๋ค์! ์๊ณ ๋ง์ผ์ จ์ต๋๋ค!!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!