๐Ÿ“– LeetCode Top Interview 150


์ž‘์„ฑ์–‘์‹

### 
#### 1. ๋ฌธ์ œ
[๋ฌธ์ œ URL]()
#### 2. ๋‚˜์˜ ํ’€์ด
##### ์‹œ๋„ 1
``` java
\```
#### 3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด
```java
\```
#### 4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

---
<br>



909. Snakes and Ladders

1. ๋ฌธ์ œ

๋ฌธ์ œ URL ๋ฑ€์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ํƒ€๊ณ  ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋ณด๋„ˆ์Šค ์ด๋™์€ ํ•œ ๋ฒˆ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ์นธ๊นŒ์ง€ ์ด๋™์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

  • ๋ณด๋“œ ๊ตฌ์„ฑ: n x n ์ •์ˆ˜ ํ–‰๋ ฌ ๋ณด๋“œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ ์…€์€ ๋ฐ”ํ† ์Šคํ† ํŽ˜๋ˆ(Boustrophedon) ์Šคํƒ€์ผ๋กœ 1๋ถ€ํ„ฐ n^2๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ: ๋ณด๋“œ์˜ 1๋ฒˆ ์นธ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ n^2๋ฒˆ ์นธ์—์„œ ๊ฒŒ์ž„์ด ๋๋‚ฉ๋‹ˆ๋‹ค.
  • ์›€์ง์ž„ ๊ทœ์น™:
    • ๊ฐ ์›€์ง์ž„๋งˆ๋‹ค ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ 1๋ถ€ํ„ฐ 6๊นŒ์ง€์˜ ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์„ ํƒ๋œ ์ˆ˜์— ๋”ฐ๋ผ ๋ชฉ์ ์ง€ ์นธ์„ ๊ฒฐ์ •ํ•˜๊ณ , ํ•ด๋‹น ์นธ์— ๋ฑ€์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฑ€์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ๋Š” ํ•œ ๋ฒˆ๋งŒ ํƒˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชฉํ‘œ:
    • n^2๋ฒˆ ์นธ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์›€์ง์ž„ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Input: board = [[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,35,-1,-1,13,-1],[-1,-1,-1,-1,-1,-1],[-1,15,-1,-1,-1,-1]]
Output: 4
Explanation: 
In the beginning, you start at square 1 (at row 5, column 0).
You decide to move to square 2 and must take the ladder to square 15.
You then decide to move to square 17 and must take the snake to square 13.
You then decide to move to square 14 and must take the ladder to square 35.
You then decide to move to square 36, ending the game.
This is the lowest possible number of moves to reach the last square, so return 4.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

๋ฐ”ํ† ์Šคํ† ํŽ˜๋ˆ(Boustrophedon) ์Šคํƒ€์ผ์ด๋ž€, ํ•œ ์ค„์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ๋ฅธ ํ›„ ๋‹ค์Œ ์ค„์ด ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ํ๋ฅด๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๋ฌธ์ œ์˜ ์˜๋„๊ฐ€ BFS์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ์—์„œ ๋ณด๋ฉด ๊ทธ๋ฆผ์—์„œ 6์œ„์— ์ˆซ์ž๊ฐ€ 7์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆซ์ž๋“ค์ด ์ด์–ด์ ธ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์‚ฌ์œ„๋ฅผ ์ตœ์†Œ๋กœ ๋˜์ ธ์„œ ๊ฐ€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋„๋ก ๊ณ ๋ฏผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ, ๋ฌธ์ œ์— ๋”ฐ๋ผ -1์˜ ๊ฒฐ๊ณผ๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ณด๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„ ์ฃผ์‚ฌ์œ„ 1๋ฒˆ์ด๋ฉด ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  board์—์„œ ๋ณด๋ฉด ์ด๋™ํ•˜๊ฒŒ ๋˜๋Š” ๊ณณ์— ์ด๋™๋˜๋Š” ์ง€์ (๋ชฉ์ ์ง€)์˜ ์ˆซ์ž๊ฐ€ ์ ํ˜€์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค 2์ฐจ ๋ฐฐ์—ด์ด ํ—ท๊ฐˆ๋ ค์„œ 1์ฐจ ๋ฐฐ์—ด newBoard๋กœ ๋ณ€ํ™˜ํ•˜๋Š” sumBoard๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    int length=0, result=0;

    public int snakesAndLadders(int[][] board) {
        length = board.length;
        if(length==0) return -1;
        for(int[] arr:board){
            if(arr.length!=length) return -1;
        }

        if(length<3) return 1;

        int[] newBoard = sumBoard(board);
        boolean[] visited = new boolean[length*length];
        bfs(newBoard, visited);
        return result;
    }

    public int[] sumBoard(int[][] board) {
        int newBoard = new int[length*length];
        int cnt=0;
        for(int i=length-1; i>=0; i--){
            if(i%2==0){
                for(int j=0; j<length; j++){
                    newBoard[cnt] = board[i][j];
                }
            }else{
                for(int j=length-1; j>=0; j--){
                    newBoard[cnt] = board[i][j];
                }
            }
            cnt++;
        }
        return newBoard;
    }
}

๊ทธ๋Ÿผ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ bfs(newBoard, visited); ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋„์ฐฉ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. BFS ์•ˆ์˜ ์„ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง„ ๋ชปํ–ˆ์ง€๋งŒ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ, 3๋ฒˆ์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ์‚ฌ๋‹ค๋ฆฌ๋กœ ์ œ์ผ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋‹ค๋ฆฌ์˜ ์‹œ์ž‘์ ๊นŒ์ง€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ์‚ฌ๋‹ค๋ฆฌ ๋„์ฐฉ์ง€์ ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์‚ฌ์œ„ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ๋”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 6์œผ๋กœ ๊ณ„์† ๊ฐ€๋Šฅ๊ฒŒ ๋น ๋ฅด๋ฏ€๋กœ ์œ„์— result ๊ฐ’์„ ์œ ์ง€ํ•˜์ง€๋งŒ, ๋ฑ€์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋ฑ€์ด ์žˆ๋‹ค๋ฉด 5๋งŒํผ ์ด๋™ํ•˜์—ฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ฃผ์‚ฌ์œ„ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ๋‹ค๋ฆฌ์™€ ๋ฑ€์˜ ์œ„์น˜ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋‹ค ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋‘ 6์œผ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ ๋“ฑ์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด๋ด…๋‹ˆ๋‹ค.
    • ๋ฑ€์œผ๋กœ ๊นŽ์ด๋Š” ์ˆ˜์™€ ์‚ฌ๋‹ค๋ฆฌ๋กœ ํ˜œํƒ์„ ๋ณด๋Š” ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ด์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋ฑ€์„ ํ”ผํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฑ€์„ ์ด์šฉํ•˜๋”๋ผ๋„ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ 2๊ฐœ ํƒˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฑ€์ด ํšจ๊ณผ์ ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
public void bfs(int[] newBoard, boolean[] visited) {
    result = (length*length)%6>0? (length*length)/6+1 : (length*length)/6;
    int location=0, cnt=0;
    while(location<length*length){
        // ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ตฌํ˜„๋  ๋ถ€๋ถ„ 
    } 
    result = Math.min(result, cnt);
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

  • ์‹ค์ œ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์—์„œ๋Š” 2D ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„๋ณด๋“œ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•ด BFS (Breadth-First Search)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ์— ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • BFS๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ, ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ ค ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” 6๊ฐ€์ง€ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋ฑ€์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ข…๋ฃŒ ์ง€์ ์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ๋•Œ๊นŒ์ง€์˜ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
class Solution {
    public int snakesAndLadders(int[][] board) {
        final int n = board.length;
        final int endSquare = n * n;
        
        short[] brd = new short[endSquare + 1];
        int brdIdx = 1;
        for (int row = n - 1; row >= 0; row--) {
            for (int col = 0; col < n; col++)  brd[brdIdx++] = (short)board[row][col];
            if (--row < 0)  break;
            for (int col = n - 1; col >= 0; col--)  brd[brdIdx++] = (short)board[row][col];
        }
        
        final int bfsQueueLen = Math.min(n * n, 8 * n);
        short[] bfsQueue = new short[bfsQueueLen];
        int bfsQueueRead = 0;
        int bfsQueueWrite = 0;
        bfsQueue[bfsQueueWrite++] = 1;  // Initialize BFS queue to start at square #1

        byte[] count = new byte[endSquare + 1];
        count[1] = 1;                   // Mark the starting location as already visited.

        while (bfsQueueRead != bfsQueueWrite) {
            int currSquare = bfsQueue[bfsQueueRead++];
            bfsQueueRead %= bfsQueueLen;
            if (currSquare + 6 >= endSquare)  return count[currSquare];
            int maxOpenMove = 0;
            for (int move = 6; move >= 1; move--) {
                int nextSquare = currSquare + move;
                if (brd[nextSquare] >= 0) {
                    if ((nextSquare = brd[nextSquare]) == endSquare)  return count[currSquare];
                }
                else {
                    if (move < maxOpenMove)  // If we already moved to an open square 1 to 6
                        continue;
                    maxOpenMove = move;
                }
                if (count[nextSquare] == 0) {
                    count[nextSquare] = (byte)(count[currSquare] + 1);
                    bfsQueue[bfsQueueWrite++] = (short)nextSquare;
                    if ((bfsQueueWrite %= bfsQueueLen) == bfsQueueRead)  return 0; // Queue overflow
                }
            }
        }
        return -1;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„์˜ ์ „ํ†ต์ ์ธ ๋ณด๋“œ๋Š” 2์ฐจ์› ํ‰๋ฉด์— ๋‚˜ํƒ€๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ, ํŠนํžˆ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋กœ ์ƒ๊ฐํ•  ๋•Œ, 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ฐ”๊พธ์–ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„ํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
BFS ๋ฌธ์ œ ์ต์ˆ™ํ•ด์ง€๋„๋ก ๋” ํ’€์–ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.



133. Clone Graph

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ๋œ (connected) ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ deep copyํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ๋…ธ๋“œ๋Š” ๊ทธ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” int ํ˜•๊ณผ ์ด์›ƒ ๋…ธ๋“œ์˜ ๋ฆฌ์ŠคํŠธ์ธ List<Node>๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” DFS์™€ BFS๋ฅผ ํ†ตํ•ด deep copy๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Input: adjList = [[2,4],[1,3],[2,4],[1,3]]
Output: [[2,4],[1,3],[2,4],[1,3]]
Explanation: There are 4 nodes in the graph.
1st node (val = 1)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
2nd node (val = 2)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
3rd node (val = 3)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
4th node (val = 4)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

DFS๋กœ ํ’€์ดํ–ˆ๋Š”๋ฐ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ You must return a copy of all the nodes in the original graph์™€ ๊ฐ™์ด ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํด๋ก ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ดค๋Š”๋ฐ ์—ฐ๊ฒฐ๋œ ๋ฌด๋ฐฉํ–ฅ ๋…ธ๋“œ๋ผ๋Š” ์ ์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
class Solution {
    public Node cloneGraph(Node node) {
        if(node==null) return null;
        if(node.neighbors.size()==0) return new Node(1);

        Node newNode = new Node(node.val);
        boolean[] visited = new boolean[100];
        dfs(node, newNode, visited);
        return newNode;
    }

    public void dfs(Node node, Node newNode, boolean[] visited) {
        List<Node> newNeighbors =  newNode.neighbors;
        visited[node.val] = true;
        for (Node n : node.neighbors) {
            if (!visited[n.val]) {
                newNeighbors.add(new Node(n.val));
                newNode.neighbors = newNeighbors;
                dfs(n, new Node(n.val), visited);
            }
        }
    }
}
์‹œ๋„ 2

์—ฐ๊ฒฐ๋œ ๋ฌด๋ฐฉํ–ฅ ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— boolean๋ณด๋‹ค map์ด ๋” ๊น”๋”ํ•œ ํ’€์ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ–๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ฐ’์€ ํ‚ค๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. map์— ํ‚ค ๊ฐ’์ด ์—†๋‹ค๋ฉด ์ฆ‰ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— for ๋ฌธ์œผ๋กœ ์› ๋…ธ๋“œ์˜ neighbor๋“ค์„ ํ•˜๋‚˜์”ฉ cloneNode์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

public class Solution {
  HashMap<Integer, Node> map = new HashMap<>();

  public Node cloneGraph(Node node) {
    if (node == null) return null;
    if(node.neighbors.size()==0) return new Node(1);
    return dfs(node);
  }

  private Node dfs(Node node) {
    if (map.containsKey(node.val)) {
      return map.get(node.val);
    }

    Node cloneNode = new Node(node.val, new ArrayList<Node>());
    map.put(node.val, cloneNode);

    for (Node neighbor : node.neighbors) {
      cloneNode.neighbors.add(dfs(neighbor));
    }

    return cloneNode;
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

pinned๋˜์–ด ์žˆ๋Š” ํ’€์ด๋ฅผ ๋ณด๊ฒŒ ๋˜์–ด ๊ฐ€์ง€๊ณ  ์™”์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ด๋ฏธ ๋ณต์‚ฌํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„์ง ๋ณต์‚ฌํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด์›ƒ ๋…ธ๋“œ๋“ค์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋•Œ, ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด Node[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฐ์—ด์€ ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋“  ์š”์†Œ๊ฐ€ null๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ์˜ val ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ณต์‚ฌ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ cloneGraph ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ deep copyํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
class Solution {
    public void dfs(Node node , Node copy , Node[] visited){
        visited[copy.val] = copy;// store the current node at it's val index which will tell us that this node is now visited
        
//         now traverse for the adjacent nodes of root node
        for(Node n : node.neighbors){
//             check whether that node is visited or not
//              if it is not visited, there must be null
            if(visited[n.val] == null){
//                 so now if it not visited, create a new node
                Node newNode = new Node(n.val);
//                 add this node as the neighbor of the prev copied node
                copy.neighbors.add(newNode);
//                 make dfs call for this unvisited node to discover whether it's adjacent nodes are explored or not
                dfs(n , newNode , visited);
            }else{
//                 if that node is already visited, retrieve that node from visited array and add it as the adjacent node of prev copied node
//                 THIS IS THE POINT WHY WE USED NODE[] INSTEAD OF BOOLEAN[] ARRAY
                copy.neighbors.add(visited[n.val]);
            }
        }
        
    }
    public Node cloneGraph(Node node) {
        if(node == null) return null; // if the actual node is empty there is nothing to copy, so return null
        Node copy = new Node(node.val); // create a new node , with same value as the root node(given node)
        Node[] visited = new Node[101]; // in this question we will create an array of Node(not boolean) why ? , because i have to add all the adjacent nodes of particular vertex, whether it's visited or not, so in the Node[] initially null is stored, if that node is visited, we will store the respective node at the index, and can retrieve that easily.
        Arrays.fill(visited , null); // initially store null at all places
        dfs(node , copy , visited); // make a dfs call for traversing all the vertices of the root node
        return copy; // in the end return the copy node
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

DFS์™€ BFS์˜ ๊ตฌํ˜„ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ง‘๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ChatGPT๋กœ ๊ตฌํ˜„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. DFS๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๊ณ , BFS๋Š” ํ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

DFS ๊ตฌํ˜„

public void dfs(Node node, boolean[] visited) {
    visited[node.val] = true;
    for (Node neighbor : node.neighbors) {
        if (!visited[neighbor.val]) {
            dfs(neighbor, visited);
        }
    }
}

BFS ๊ตฌํ˜„
BFS์—์„œ๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์›ƒ ๋…ธ๋“œ๋“ค์„ ํ์— ์ถ”๊ฐ€ํ•œ ํ›„์—, ํ์—์„œ ํ•˜๋‚˜์”ฉ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์–ด ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋จผ์ € ์ถ”๊ฐ€๋œ ์ด์›ƒ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

public void bfs(Node node, boolean[] visited) {
    Queue<Node> queue = new LinkedList<>();
    queue.offer(node);
    visited[node.val] = true;
    while (!queue.isEmpty()) {
        Node curr = queue.poll();
        for (Node neighbor : curr.neighbors) {
            if (!visited[neighbor.val]) {
                queue.offer(neighbor);
                visited[neighbor.val] = true;
            }
        }
    }
}


211. Design Add and Search Words Data Structure

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋‹จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด์ „์— ์ถ”๊ฐ€๋œ ๋‹จ์–ด์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
Input
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
Output
[null,null,null,null,false,true,true,true]

Explanation
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // return False
wordDictionary.search("bad"); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search("b.."); // return True
class WordDictionary {

    public WordDictionary() {
        
    }
    
    public void addWord(String word) {
        
    }
    
    public boolean search(String word) {
        
    }
}

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

208๋ฒˆ ๋ฌธ์ œ์™€ ๋™์ผํ•˜๊ฒŒ ๋จผ์ € Trie ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • [".ad"],["b.."] ๋ถ€๋ถ„์„ ๊ณ ๋ฏผํ•ด์•ผ ํ–ˆ๋Š”๋ฐ .์—๋Š” ์–ด๋–ค ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋”๋ผ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
class WordDictionary {
    WordDictionary[] arr;
    boolean isChar;

    public WordDictionary() {
        arr = new WordDictionary[26];
        isChar = false;
    }
    
    public void addWord(String word) {
        if(root==null) root=new WordDictionary();
        WordDictionary temp=root;
        for(char c:word.toCharArray()){
            int ind=c-'a';
            if(temp.child[ind]==null) temp.child[ind]=new WordDictionary();
            temp=temp.child[ind];
        }
        temp.isLast=true;
    }
    
    public boolean search(String word) {
      if(root==null) root=new WordDictionary();
      WordDictionary temp=root;
      for(char c : word.toCharArray()){
          int idx = c-'a';
          if(temp.children[idx] == null){
             return false;
          }
          temp = temp.children[idx];
      }
      return temp.isWord == true;        
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

WordDictionary ํด๋ž˜์Šค๋Š” Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์–ด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. addWord ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์–ด๋ฅผ Trie์— ์ถ”๊ฐ€ํ•˜๊ณ , search ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋‹จ์–ด๊ฐ€ Trie์— ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
์ด ์ฝ”๋“œ์—์„œ๋Š” โ€˜.โ€™ ๋ฌธ์ž๋ฅผ ์™€์ผ๋“œ์นด๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€˜.โ€™ ๋ฌธ์ž๋Š” ์–ด๋–ค ๋ฌธ์ž๋“ ์ง€ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ checkWord ๋ฉ”์„œ๋“œ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

class WordDictionary {
    boolean isLast;
    WordDictionary [] child;
    public WordDictionary() {
        this.isLast=false;
        this.child=new WordDictionary[26];
    }
    WordDictionary root;
    public void addWord(String word) {
        if(root==null) root=new WordDictionary();
        WordDictionary temp=root;
        for(char c:word.toCharArray()){
            int ind=c-'a';
            if(temp.child[ind]==null) temp.child[ind]=new WordDictionary();
            temp=temp.child[ind];
        }
        temp.isLast=true;
    }
    
    public boolean search(String word) {
        return checkWord(word,0,root);
    }
    public boolean checkWord(String word,int ind,WordDictionary temp){
        if(ind>=word.length()) return temp.isLast;
        if(temp==null) return false;
        char c=word.charAt(ind);
        if(c!='.'){
             if(temp.child[c-'a']!=null) return checkWord(word,ind+1,temp.child[c-'a']);
             else return false;
        }
        else{
            boolean b=false;
            for(int i=0;i<26;i++){
                if(temp.child[i]!=null) b= b || checkWord(word,ind+1,temp.child[i]);
            }
            return b;
        }
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๊ธฐ๋ณธ์ ์ธ Trie ๊ตฌํ˜„์—์„œ์˜ search์™€ ์ด ๋ฌธ์ œ์—์„œ search ์กฐ๊ฑด์˜ ์ฐจ์ด๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.



208. Implement Trie

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • Trie๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
    • Trie() : Trie ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • void insert(String word) : ๋ฌธ์ž์—ด word๋ฅผ trie์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    • boolean search(String word) : ๋ฌธ์ž์—ด word๊ฐ€ trie์— ์žˆ๋Š” ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • boolean startsWith(String prefix) : ์ ‘๋‘์‚ฌ prefix๋ฅผ ๊ฐ€์ง„ ์ด์ „์— ์‚ฝ์ž…๋œ ๋ฌธ์ž์—ด์ด ์žˆ๋Š” ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

Map์„ ์ด์šฉํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„์ง€๊ณ  ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class TrieNode{
  Map<Character, TrieNode> nodes = new HashMap<>();
  boolean isLast;
  
  Map<Character, TrieNode> getNodes(){
    return this.nodes;
  }
  
  boolean isLast(){
    return this.isLast;
  }
  
  void setIsLas(boolean isLast){
    this.isLast = isLast;
  }
}
class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }
    
    public void insert(String word) {
        TrieNode curr = root;
        for (char c : word.toCharArray()) {
            TrieNode node = curr.getChild(c);
            if (node == null) {
                node = new TrieNode();
                curr.setChild(c, node);
            }
            curr = node;
        }
        curr.setEndOfWord(true);
    }
    
    public boolean search(String word) {
        TrieNode curr = root;
        for (char c : word.toCharArray()) {
            TrieNode node = curr.getChild(c);
            if (node == null) {
                return false;
            }
            curr = node;
        }
        return curr.isEndOfWord();
    }
    
    public boolean startsWith(String prefix) {
        TrieNode curr = root;
        for (char c : prefix.toCharArray()) {
            TrieNode node = curr.getChild(c);
            if (node == null) {
                return false;
            }
            curr = node;
        }
        return true;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

Trie ํด๋ž˜์Šค๋Š” Node ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ Trie ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Node ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” isWord ๋ณ€์ˆ˜์™€ 26๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ(children ๋ฐฐ์—ด)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Trie ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์—์„œ root ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
  • insert ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ Trie์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฌธ์ž์—ด์„ ํ•œ ๊ธ€์ž์”ฉ ์ˆœํšŒํ•˜๋ฉฐ ํ•ด๋‹น ๊ธ€์ž์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • search ๋ฉ”์†Œ๋“œ๋Š” Trie์— ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฌธ์ž์—ด์„ ํ•œ ๊ธ€์ž์”ฉ ์ˆœํšŒํ•˜๋ฉฐ ํ•ด๋‹น ๊ธ€์ž์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ธ€์ž๊นŒ์ง€ ์ˆœํšŒํ•œ ํ›„ isWord ๋ณ€์ˆ˜๊ฐ€ true์ธ ๊ฒฝ์šฐ์—๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • startsWith ๋ฉ”์†Œ๋“œ๋Š” Trie์— ํ•ด๋‹น prefix๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, prefix๋ฅผ ํ•œ ๊ธ€์ž์”ฉ ์ˆœํšŒํ•˜๋ฉฐ ํ•ด๋‹น ๊ธ€์ž์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ธ€์ž๊นŒ์ง€ ์ˆœํšŒํ•œ ํ›„ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
class Node{
    Node children[] = new Node[26];
    boolean isWord = false;
}


class Trie {
  Node root;

    public Trie() {
        root = new Node();
    }
    
    public void insert(String word) {
        Node temp = root;
        for(char c : word.toCharArray()){
            int idx = c-'a';
            if(temp.children[idx] == null){
                temp.children[idx] = new Node();
            }
            temp = temp.children[idx];
        }
        temp.isWord = true;
    }
    
    public boolean search(String word) {
      Node temp = root;
        for(char c : word.toCharArray()){
            int idx = c-'a';
            if(temp.children[idx] == null){
               return false;
            }
            temp = temp.children[idx];
        }
        return temp.isWord == true;        
    }
    
    public boolean startsWith(String prefix) {
         Node temp = root;
        for(char c : prefix.toCharArray()){
            int idx = c-'a';
            if(temp.children[idx] == null){
                return false;
            }
            temp = temp.children[idx];
        }
        return true;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

Trie ๊ตฌ์กฐ๋Š” ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ ์‚ฌ์ด์—๋Š” ๋ฌธ์ž์—ด์˜ ์ ‘๋‘์–ด ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์™€ ๋ฌด๊ด€ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ์™ธ์—๋„ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ ๋“ฑ์—๋„ ์ด์šฉ๋ฉ๋‹ˆ๋‹ค.



637. Average of Levels in Binary Tree

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ๊ฐ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ์˜ ํ‰๊ท  ๊ฐ’์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋‹ต๊ณผ 10^-5 ์ด๋‚ด์˜ ์ •ํ™•๋„๋กœ ์ผ์น˜ํ•˜๋Š” ๋‹ต์•ˆ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์ด์ง„ ํŠธ๋ฆฌ๋ผ๋Š” ์ ์—์„œ ๊ฐ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ ๊ฐ’์„ ๋”ํ•ด์„œ ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ๊ฐ–์œผ๋ฉด ๊ทธ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ์ด ํ’€์ด์—์„œ๋Š” ๊ฐ™์€ ๋…ธ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์ œ๋Œ€๋กœ ํ™•์ธํ•˜์ง€ ์•Š์€ ์ฑ„ ๊ณ„์‚ฐ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ: [3,9,20,null,null,15,7]
  • ๊ฒฐ๊ณผ: [6.00000,11.75000,10.80000,10.80000,10.80000]
  • ์ •๋‹ต: [3.00000,14.50000,11.00000]
class Solution {
    List<Double> list = new ArrayList<>();
    int valSum=0, cntSum=0;
    public List<Double> averageOfLevels(TreeNode root) {
        getAverage(root, 0);
        return list;
    }
    public void getAverage(TreeNode root, int h) {
        if(root==null) return;
        valSum+=root.val;
        cntSum++;
        getAverage(root.left, h++);
        getAverage(root.right, h++);
        list.add((double)valSum/cntSum);
    }
}
์‹œ๋„ 2

๋งˆ์ง€๋ง‰์— ํ‰๊ท ๊ฐ’์„ list์— ๋„ฃ๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์ผ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๊ฑธ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณ„์‚ฐ์— ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๊ฐ™์€ ์ธต ์—ฌ๋ถ€๋ฅผ ์ œ๋Œ€๋กœ ํ™•์ธํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public void getAverage(TreeNode root, int h) {
    if(root==null) return;
    valSum+=root.val;
    cntSum++;
    if(root.right==null){
        list.add((double)valSum/cntSum);
        valSum=0;
        cntSum=0;
    }
    getAverage(root.left, h++);
    getAverage(root.right, h++);
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

Queue๋ฅผ ์ด์šฉํ•œ ํ’€์ด๊ฐ€ ์ƒˆ๋กœ์›Œ์„œ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋นˆ ๋ฆฌ์ŠคํŠธ ans๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋นˆ ํŠธ๋ฆฌ์ธ ๊ฒฝ์šฐ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ q๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ํ˜„์žฌ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์„ ํ•ฉ์‚ฐํ•˜๊ณ  ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด ํ‰๊ท ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋ ˆ๋ฒจ์˜ ํ‰๊ท  ๊ฐ’์„ ans ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • BFS๊ฐ€ ๋๋‚˜๋ฉด ans ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> ans = new ArrayList<>();
        if(root==null){
            return ans;
        }
       Queue<TreeNode> q=new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            int n=q.size();
           double avg=0l;
            for(int i=0;i<n;i++){
                 TreeNode curr=q.poll();
                avg=avg+(double)curr.val;
                if(curr.left!=null){q.add(curr.left);}
                if(curr.right!=null){q.add(curr.right);}
            }
            avg=avg/n;
            ans.add(avg);
        }
       return ans; 
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

queue.offer(node)๋Š” node๋ผ๋Š” ์š”์†Œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ ์žˆ์ง€ ์•Š๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ€๋“ ์ฐจ ์žˆ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ์— ์š”์†Œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



199. Binary Tree Right Side View

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ด์ง„ ํŠธ๋ฆฌ์˜ ์˜ค๋ฅธ์ชฝ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋ณด๋ฉด์„œ ๋งจ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ(๊ฐ ๋ ˆ๋ฒจ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ)๋“ค์˜ ๊ฐ’์„ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๊ฐ€์žฅ ๋จผ์ € ๋“  ์ƒ๊ฐ์€ ์šฐ์„  ๊ฐ ๋…ธ๋“œ ์ธต์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ list์— ์ €์žฅํ•˜๊ณ  ๋ฆฌํ„ดํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ๋ผ๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์ž‘์ • ํ’€์—ˆ์„ ๋•Œ ์™ผ์ชฝ ๋…ธ๋“œ์—์„œ ์˜ค๋ฅธ์ชฝ ๋ณด๋‹ค ๊ธด ๊ฒฝ์šฐ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•ด์„œ ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋” ์ด์šฉํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    int h=0;
    List<Integer> list = new ArrayList<>();
    public hList<Integer> rightSideView(TreeNode root) {
        deepth(root);
        getRight(root);
        if(h==list.size()) return list;
        else{
            
        }
    }

    public void deepth(TreeNode root){
        if(root==null) return; 
        deepth(root.left);
        h++;
        deepth(root.right);
    }

    public void getRight(TreeNode root){
        if(root==null) return; 
        list.add(root.val);
        deepth(root.right);
    }
}
์‹œ๋„ 2

์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ•œ ํ’€์ด์ž…๋‹ˆ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ๋ณด๋ฉด, ๋…ธ๋“œ์˜ ๋†’์ด h๋ฅผ ์ด์šฉํ–ˆ๋Š”๋ฐ, rightSideView(root.right);๋ฅผ ๋‹ค ๋Œ๊ณ ๋‚˜์„œ h++;๊ฐ€ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ์ธต์˜ ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ถ„๋ฆฌํ•ด์„œ ๋…ธ๋“œ์˜ ์ธต์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
class Solution {
    int h=0;
    List<Integer> list = new ArrayList<>();
    public List<Integer> rightSideView(TreeNode root) {
        if(root==null) return null;
        if(h==list.size()) list.add(root.val);

        rightSideView(root.right);
        h++;
        rightSideView(root.left);

        return list;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์—ฌ๊ธฐ์„œ ์ฃผ์˜๊นŠ๊ฒŒ ๋ณธ ๋ถ€๋ถ„์€ rightView์—์„œ ์žฌ๊ท€๋ฅผ ๋Œ ๋•Œ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ตœ์†Œ๊ฐ’ ๋˜๋Š” k๋ฒˆ์งธ๋กœ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘ํšŒ์ˆœํšŒ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹๊ณผ ๋ฐ˜๋Œ€๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        rightView(root, result, 0);
        return result;
    }
    
    public void rightView(TreeNode curr, List<Integer> result, int currDepth){
        if(curr == null){
            return;
        }
        if(currDepth == result.size()){
            result.add(curr.val);
        }
        
        rightView(curr.right, result, currDepth + 1);
        rightView(curr.left, result, currDepth + 1);
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์— ์•„๋Š” ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ™œ์šฉํ•ด์„œ ํ’€์ดํ•  ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ์˜ค๋ฅธ์ชฝ ๋ทฐ๋กœ ์‚ดํŽด๋ณด๋Š” ๋ฌธ์ œ์˜€์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด ์™ผ์ชฝ ๋ทฐ๋กœ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public class Solution {
    public List<Integer> leftSideView(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        rightView(root, result, 0);
        return result;
    }
    
    public void leftView(TreeNode curr, List<Integer> result, int currDepth){
        if(curr == null){
            return;
        }
        if(currDepth == result.size()){
            result.add(curr.val);
        }

        leftView(curr.left, result, currDepth + 1);
        leftView(curr.right, result, currDepth + 1);
    }
}


230. Kth Smallest Element in a BST

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ (BST)์˜ ๋ฃจํŠธ์™€ ์ •์ˆ˜ k๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ’ ์ค‘์—์„œ k๋ฒˆ์งธ๋กœ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

BST์˜ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ’์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ k๋ฒˆ์งธ๋กœ ์ž‘์€ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 530. Minimum Absolute Difference in BST ๋ฌธ์ œ๋ฅผ ํ‘ผ ์ดํ›„๋ผ์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
class Solution {
    List<Integer> list = new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
        if(root==null){
            Collections.sort(list);
            if(list.size()<k) return 0;
            else return list.get(k-1);
        } 
        list.add(root.val);
        kthSmallest(root.left, k);
        kthSmallest(root.right, k);

        Collections.sort(list);
        if(list.size()<k) return 0;
        else return list.get(k-1);
    }
}

์ด๊ฒƒ๋„ ํ†ต๊ณผ ์ฝ”๋“œ์ด๊ธด ํ•˜์ง€๋งŒ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    List<Integer> list = new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
        if(root==null){
            return getAnswer(list, k);  
        } 
        list.add(root.val);
        kthSmallest(root.left, k);
        kthSmallest(root.right, k);
        return getAnswer(list, k);        
    }

    public int getAnswer(List<Integer> list, int k) {
        Collections.sort(list);
        if(list.size()<k) return 0;
        else return list.get(k-1);

    }
}

์ œ๊ฐ€ ํ‘ผ ํ’€์ด์˜ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์ด ํ’€์ด๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๋ฉด์—์„œ ์†ํ•ด๋ฅผ ๋ดค์ง€๋งŒ ๋ฒˆ๋ฒˆํžˆ sort์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ์ œ ์ฝ”๋“œ์™€๋Š” ๋‹ฌ๋ฆฌ ๋งˆ์ง€๋ง‰์—์„œ๋งŒ return์œผ๋กœ k๋ฒˆ์งธ๋กœ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    List<Integer> list=new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
        if(root==null)return 0;
        help(root,k);
        return list.get(k-1);
    }
    public void help(TreeNode root,int k)
    {
        if(root==null)return;
        help(root.left,k);
        list.add(root.val);
        if(list.size()==k)return;
        help(root.right,k);
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด์„œ ์ œ ์ฝ”๋“œ(์‹œ๋„ 2)์˜ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ์ฝ”๋“œ์—์„œ๋Š” ์ค‘๋ณต ๋…ธ๋“œ ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ค‘์œ„ ์ˆœํšŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ’์„ ์ค‘๋ณต์œผ๋กœ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜์ค‘์— ์ •๋ ฌํ•˜์—ฌ k๋ฒˆ์งธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, count๋กœ ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ •๋ ฌํ•˜์ง€ ์•Š์•„๋„ ์ค‘๊ฐ„์— ์ •์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๋ฌธ์ œ์—์„œ ์ด๋Ÿฐ ์Šคํƒ€์ผ๋กœ์˜ ๊ตฌํ˜„๋ฐฉ๋ฒ•์„ ์ตํ˜€๋‘˜ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Solution {
    int result;
    int count;

    public int kthSmallest(TreeNode root, int k) {
        count = 0;
        inOrderTraversal(root, k);
        return result;
    }

    private void inOrderTraversal(TreeNode node, int k) {
        if (node == null) return;
        
        inOrderTraversal(node.left, k);
        count++;
        
        if (count == k) {
            result = node.val;
            return;
        }
        
        inOrderTraversal(node.right, k);
    }
}



530. Minimum Absolute Difference in BST

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ฃผ์–ด์ง„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(BST)์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ ๊ฐ’ ์ค‘ ์ตœ์†Œ ์ ˆ๋Œ€ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, BST์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, [1,null,5,3] root๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค๋ฉด, ๊ทธ ์ตœ์†Œ ์ ˆ๋Œ€ ์ฐจ์ด๋Š” 2๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1
  • ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ์— ์ž˜๋ชป ์•Œ๊ณ  ์ ‘๊ทผํ•ด์„œ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ˆœ์„œ๋Œ€๋กœ val๊ฐ€ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์™ผ์ชฝ ๋…ธ๋“œ์™€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์˜ ์ฐจ์ด๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, [5,4,7] root์—์„œ ์ตœ์†Œ ์ ˆ๋Œ€ ์ฐจ์ด๋Š” 1๋กœ ์ธ์ ‘ ๋…ธ๋“œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋†’์ด๊ฐ€ ์•„๋‹ˆ๋ผ..!!
class Solution {
    int left=0, right=0;
    public int getMinimumDifference(TreeNode root) {
        TreeNode lroot = root;
        TreeNode rroot = root;
        while(lroot.left!=null){
            lroot = lroot.left;
            left++;
        }
        while(rroot.right!=null){
            rroot = rroot.right;
            right++;
        }
        return Math.abs(left-right);
    }
}
์‹œ๋„ 2

๊ทธ๋Ÿผ ๋‹ค์‹œ ์ธ์ ‘ ๋…ธ๋“œ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์žฌ๊ท€์  ํ’€์ด๋ฅผ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์—์„œ ๋งŒ๋“ค์–ด๋ดค๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ค‘์œ„ ์ˆœํšŒ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ค‘๊ฐ„๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ ์ตœ์†Œ ์ฐจ์ด ๊ฐ’์ด ์•„๋‹Œ ๊ฐ’์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
  • [0,null,2236,1277,2776,519] ๊ฐ’์—์„œ ์›ํ•˜๋Š” ์ •๋‹ต์€ 519์˜€๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, 519๋Š” ์œ„์˜ ๋…ธ๋“œ ๊ฐ’ 1277๊ณผ์˜ ์ฐจ์ด ์™ธ์—๋„ 0๊ณผ์˜ ์ฐจ์ด๋„ ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฒŒ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
    • ์ผ๋‹จ ์‹œ๋„ 2์—์„œ 2๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
      • root.val-prev์—์„œ ์ ˆ๋Œ€๊ฐ’ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”์—†์Šต๋‹ˆ๋‹ค. ์ค‘์œ„์ˆœํšŒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์ด ์ž˜๋ชป๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์ด -10000 ์ด์ƒ์ด๋ผ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, prev ๊ฐ’์„ -10000์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „์—๋„ ์ด์ „ ๋…ธ๋“œ์™€ ํ˜„์žฌ ๋…ธ๋“œ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class Solution {
  int min=10000, prev=0;
  public int getMinimumDifference(TreeNode root) {
    if(root==null) return min;
    getMinimumDifference(root.left);
    if(prev!=0) min=Math.min(min, Math.abs(root.val-prev));
    prev=root.val;
    getMinimumDifference(root.right);

    return min;
  }
}
์‹œ๋„ 3

์œ„์— ๊ณ ๋ฏผํ•œ ๋‚ด์šฉ๋“ค์„ ๋ฐ˜์˜ํ•œ ํ†ต๊ณผ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
  int prev = -100000, min = 100000;
  public int getMinimumDifference(TreeNode root) {
    if(root==null) return min;
    getMinimumDifference(root.left);
    min=Math.min(min, root.val-prev);
    prev=root.val;
    getMinimumDifference(root.right);
    return min;
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

void inOrderTraversal ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์—†์ง€๋งŒ min ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด BST์˜ ๋…ธ๋“œ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋‘ ๋…ธ๋“œ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ์†Œ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
class Solution {
    int min = Integer.MAX_VALUE;
    TreeNode prev = null;
    
    public int getMinimumDifference(TreeNode root) {
        inOrderTraversal(root);
        return min;
    }

    private void inOrderTraversal(TreeNode node) {
        if (node == null) {
            return;
        }

        inOrderTraversal(node.left);

        if (prev != null) {
            min = Math.min(min, Math.abs(node.val - prev.val));
        }
        prev = node;

        inOrderTraversal(node.right);
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(BST)์— ๋Œ€ํ•˜์—ฌ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ ํŠน์ง•๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ’์€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.


33. Search in Rotated Sorted Array

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์ด ๋ฌธ์ œ ์—ญ์‹œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(log n)๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ๋‹ค์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public int search(int[] nums, int target) {
        List<Integer> list = new ArrayList<>();
        for(int i:nums){
            list.add(i);
        }
        int index = list.indexOf(target);
        if(index==-1) return -1;
        else return index;
    }
}
์‹œ๋„ 2

์ด์ง„๊ฒ€์ƒ‰์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. left๊ฐ€ right๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋™์•ˆ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ค‘๊ฐ„ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ: mid ๋ณ€์ˆ˜์— left์™€ right์˜ ์ค‘๊ฐ„ ๊ฐ’์ธ (left + right) / 2๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„ ๊ฐ’๊ณผ ํƒ€๊ฒŸ ๊ฐ’ ๋น„๊ต: nums[mid]๊ฐ€ target๊ณผ ๊ฐ™์œผ๋ฉด mid๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๊ฐ„ ๊ฐ’์ด ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•  ๋•Œ:
      • ํƒ€๊ฒŸ์ด ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•˜๋ฉด, right ๊ฐ’์„ mid - 1๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ์„ ์ขํž™๋‹ˆ๋‹ค.
      • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, left ๊ฐ’์„ mid + 1๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์™ผ์ชฝ์„ ์ขํž™๋‹ˆ๋‹ค.
    • ์ค‘๊ฐ„ ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•  ๋•Œ:
      • ํƒ€๊ฒŸ์ด ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•˜๋ฉด, left ๊ฐ’์„ mid + 1๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์™ผ์ชฝ์„ ์ขํž™๋‹ˆ๋‹ค.
      • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, right ๊ฐ’์„ mid - 1๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ์„ ์ขํž™๋‹ˆ๋‹ค.
  • ํƒ์ƒ‰ ์‹คํŒจ: ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๋ฉด, ํƒ€๊ฒŸ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋ฏ€๋กœ -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] >= nums[left]) {
                if (target >= nums[left] && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {
                if (target <= nums[right] && target > nums[mid]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์ด์ง„๊ฒ€์ƒ‰์„ ์ด์šฉํ•œ ํ’€์ด๋Š” ์ œ ํ’€์ด์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ–ˆ์–ด์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ ์—ญ์‹œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(log n)๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ๋‹ค์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์„ ์—์„œ ์‚ฌ์‹ค target๋งŒ ์ฐพ์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋ชจ๋‘ ๋น„๊ตํ•œ ํ’€์ด๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
  public int search(int[] nums, int target) {
    int n = nums.length ;
    for( int i = 0 ; i< n ; i++){
      if( nums[i]==target ){
        return i ;
      }
    }
    return -1;
  }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์ด ํšŒ์ „๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋ถ„์ด ์ •๋ ฌ๋˜์–ด ์žˆ๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ํšŒ์ „๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋„ ์ด์ง„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋„ 2 ํ’€์ด์—์„œ๋Š” ํšŒ์ „๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ฐพ๊ธฐ ์œ„ํ•ด nums[mid] >= nums[left]์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด๋ฌธ์€ ์ค‘๊ฐ„ ๊ฐ’์ด ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•˜๋Š”์ง€ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์†ํ•˜๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ ํšŒ์ „๋œ ๋ฐฐ์—ด์—์„œ๋„ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



153. Find Minimum in Rotated Sorted Array

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋ฌธ์ œ์—์„œ rotated๋ผ๊ณ  ํ•ด์„œ ํ—ท๊ฐˆ๋ฆด์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ์—์„œ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด nums์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๊ตฌํ•˜๋Š” 162๋ฒˆ ๋ฌธ์ œ ์ฐธ๊ณ 

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์ด๋ ‡๊ฒŒ ํ’€๋ฉด ์•„์ฃผ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(log n)๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ์Œ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
class Solution {
    public int findMin(int[] nums) {
        for(int i=0; i<nums.length-1; i++){
            if(nums[i]>nums[i+1]) return nums[i+1];
        }
        return nums[0];
    }
}
์‹œ๋„ 2

์ด์ง„๊ฒ€์ƒ‰์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • left์™€ right ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋์ ์„ ๋‚˜ํƒ€๋‚ด๊ณ , mid ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๊ฐ„ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • while๋ฌธ์—์„œ๋Š” left์™€ right๊ฐ€ ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ, mid ์ง€์ ์˜ ๊ฐ’์ด mid+1 ์ง€์ ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ mid+1 ์ง€์ ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , mid ์ง€์ ์˜ ๊ฐ’์ด mid-1 ์ง€์ ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ mid ์ง€์ ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  mid ์ง€์ ์˜ ๊ฐ’์ด ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ left๋ฅผ mid+1๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ right๋ฅผ mid-1๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ตญ left ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๊ฐ€ ํšŒ์ „๋œ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ์˜ ์œ„์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
  public int findMin(int[] nums) {
    int n = nums.length;
    if(n==1) return nums[0];

    int left = 0, right = n-1;
    if(nums[right]>nums[0]) return nums[0];

    while(left<right){
      int mid = left + (right-left)/2;
      if(nums[mid]>nums[mid+1]) return nums[mid+1];
      if(nums[mid-1]>nums[mid]) return nums[mid];
      if(nums[mid]>nums[0]){
        left = mid+1;
      } else {
        right = mid-1;
      }
    }
    return nums[left];
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

๊ฐ™์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋ณ€์ˆ˜๋‚˜ ํ’€์ด๊ฐ€ ๋” ๊น”๋”ํ•˜๊ณ  ๋ณด๊ธฐ ์ข‹์•„์„œ Solutions์— ์žˆ๋Š” ํ’€์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์™”์Šต๋‹ˆ๋‹ค.

class Solution {
    public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while (left < right) {
            int mid = left + (right - left) / 2;

            if (nums[mid] > nums[right]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }

        return nums[left];
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์ „๋œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ด ๊ฐ’์„ ์ฐพ์€ ํ›„์— ์–ด๋Š ๋ถ€๋ถ„์„ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.



162. Find Peak Element

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • Peek ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์—์„œ๋Š” O(log n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ํ–ˆ์Œ์œผ๋กœ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

ํ‰์†Œ๋Œ€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ Arrays.sort(nums); ์ •๋ ฌ ํ›„ List๋ฅผ ์ด์šฉํ•ด ๊ฐ€์žฅ ํฐ ์š”์†Œ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ํฌ๊ธฐ๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public int findPeakElement(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for(int i:nums){
            list.add(i);
        }
        Arrays.sort(nums);
        int answer = list.indexOf(nums[nums.length-1]);
        return answer;
    }
}

์‹œ๋„ 2

๋ฌธ์ œ์˜ ์˜๋„๋Œ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์ง„ํƒ์ƒ‰(Binary Search) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ’€์ดํ–ˆ์„ ๋•Œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
   public int findPeakElement(int[] nums) {
      int left=0, right=nums.length-1;
      int middle=(nums[left]+nums[right])/2;
      while(left<right){
         if(nums[middle-1]<nums[middle] && nums[middle+1]<nums[middle]) return middle;
         if(nums[middle-1]<nums[middle]) left=middle+1;
         else right=middle-1;
      }
      return left; 
   }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

๋ฆฌํ„ด๊ฐ’์ด 0์ด ๋‚˜์˜ฌ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฐ’๊ณผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ peak์ธ ๊ฒฝ์šฐ๋ฅผ ๋จผ์ € ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  while๋ฌธ์œผ๋กœ ์ด์ง„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„๊ฐ’ ์–‘์˜†์˜ ๊ฐ’๋ณด๋‹ค ์ค‘๊ฐ„๊ฐ’์ด ํฐ ๊ฒฝ์šฐ๋Š” ์ค‘๊ฐ„๊ฐ’์„ retrunํ•ฉ๋‹ˆ๋‹ค.

class Solution {
    public int findPeakElement(int[] nums) {
        int n = nums.length;
        if(n == 1 || nums[0] > nums[1]) return 0;
        if(nums[n - 1] > nums[n - 2]) return n - 1;
        int l = 0;
        int r = n - 1;
        while(l <= r)
        {
            int m = (l + r)/2;
            int minus = m == 0 ? Integer.MIN_VALUE : nums[m-1];
            int plusUltra = m == n - 1 ? Integer.MIN_VALUE : nums[m+1];
            if(minus < nums[m] && plusUltra < nums[m]) return m;
            if(minus < nums[m]) l = m + 1;
            else r = m - 1;
        }
        return l;
    }
}


148. Sort List

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ฃผ์–ด์ง„ ListNode๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ListNode๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ListNode๋Š” val์™€ ListNode๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์ฃผ์–ด์ง„ ListNode์˜ ๊ฐ’๋“ค์„ ์ฐพ์•„ ์ˆœ์„œ๋Œ€๋กœ List๋กœ ์ •๋ ฌํ•˜๊ณ  ์ด ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ListNode๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ฌธ์ œ์˜ Follow up์—์„œ๋Š” ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘ธ๋Š” ๋ฐฉ์‹์€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public ListNode sortList(ListNode head) {
        if(head==null) return head;
        
        List<Integer> list = new ArrayList<>();
        while(head!=null){
            list.add(head.val);
            head = head.next;
        }
        Collections.sort(list);
        Collections.reverse(list);

        ListNode answer = new ListNode();
        for(int i=0; i<list.size(); i++){
            if(i==0) answer = new ListNode(list.get(i));
            else answer = new ListNode(list.get(i), answer);
        }
        return answer;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)๊ฐ€ ๋‚˜์˜ค๋Š” ํ’€์ด์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉ ์ •๋ ฌ๋กœ ์ •๋ ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • dummy๋กœ ๊ฐ’์ด 0์ด๊ณ , next ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์ง„ head์ธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ ๋ฐฐ์—ดํ˜•ํƒœ์ธ sublists, sublist_tail์„ ๋งŒ๋“ค๊ณ , ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ(sublist)์˜ ํฌ๊ธฐ๋ฅผ 1, 2, 4, 8, โ€ฆ ๋“ฑ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n)์ž…๋‹ˆ๋‹ค.
    • sublists์™€ sublists_tail์€ ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ด ๋ฐฐ์—ด๋“ค์˜ ํฌ๊ธฐ๋Š” ์ƒ์ˆ˜๊ฐ’์ธ 2๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ์™€๋Š” ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜๋Š” ๊ณต๊ฐ„์„ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ƒ์ˆ˜ ํฌ๊ธฐ์˜ ๊ณต๊ฐ„๋งŒ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด ๋ฉ๋‹ˆ๋‹ค.
public ListNode sortList(ListNode head) {
  ListNode dummy = new ListNode(0);
  dummy.next = head;

  ListNode [] sublists = new ListNode[2];
  ListNode [] sublists_tail = new ListNode[2];

  // Grab sublists of size 1, then 2, then 4, etc, until fully merged
  for (int steps = 1;; steps *= 2) {
    // Record the progress of the current pass into a single semi sorted list by updating
    // the next of the previous node (or the dummy on the first loop)
    ListNode prev = dummy;

    // Keep track of how much is left to process on this pass of the list
    ListNode remaining = prev.next;

    int num_loops = 0;
    for (; null != remaining; ++num_loops) {
      // Split 2 sublists of steps length from the front
      for (int i = 0; i < 2; ++i) {
        sublists[i] = remaining;
        sublists_tail[i] = null;
        for (int j = 0; null != remaining && j < steps; ++j) {
          sublists_tail[i] = remaining;
          remaining = remaining.next;
        }
        // Ensure the subslist (if one was made) is terminated
        if (null != sublists_tail[i]) {
          sublists_tail[i].next = null;
        }
      }

      // We have two sublists of (upto) length step that are sorted, merge them onto the end into a single list of (upto) step * 2
      while (null != sublists[0] && null != sublists[1]) {
        if (null == sublists[1] || sublists[0].val <= sublists[1].val) {
          prev.next = sublists[0];
          sublists[0] = sublists[0].next;
        } else {
          prev.next = sublists[1];
          sublists[1] = sublists[1].next;
        }
        prev = prev.next;
      }   

      // One list has been finished, attach what ever is left of the other to the end
      if (null != sublists[0]) {
        prev.next = sublists[0];
        prev = sublists_tail[0];
      } else {
        prev.next = sublists[1];
        prev = sublists_tail[1];
      }
    }

    // If the entire list was full processed in a single loop, it means we've completely sorted the list and are done
    if (1 >= num_loops) {
      return dummy.next;
    }
  }
}

๋‹ค๋ฅธ ํ’€์ด๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ ๋‹ค์Œ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๊ณ  ์ •๋ ฌ๋œ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. Arrays.sort(arr);๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ œ ํ’€์ด์™€ ์œ ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public ListNode sortList(ListNode head) {
        int count = 0;
        ListNode temp = head;
        while(temp!=null){
            count++;
            temp = temp.next;
        }
        int[] arr = new int[count];
        temp = head;
        count = 0;
        while(temp!=null){
            arr[count++] = temp.val;
            temp = temp.next;
        }
        Arrays.sort(arr);
        temp = head;
        count = 0;
        while(temp!=null){
            temp.val = arr[count++];
            temp = temp.next;
        }
        return head;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ด ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜ ํฌ๊ธฐ์˜ ๊ณต๊ฐ„๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋”๋ผ๋„ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.



242. Valid Anagram

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง€๋Š” ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด Anagram์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ Anagram์ด๋ž€ ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ฐฐ์น˜ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

HashMap์„ ์ด์šฉํ•œ ํ’€์ด์ž…๋‹ˆ๋‹ค.

  • "hhbywxfzydbppjxnbhezsxepfexkzofxyqdvcgdvgnjbvih...์™€ ๊ฐ™์ด ๊ธด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 41๋ฒˆ์—์„œ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
    • s_map๊ณผ t_map์€ ๋™์ผํ•˜๊ฒŒ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ–ˆ์œผ๋‚˜ ์ผ๋ถ€ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค return ๊ฐ’์ด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.
    • if(s.length()!=t.length()) return false; ์—ฌ๊ธฐ ๋ถ€๋ถ„์ด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
  public boolean isAnagram(String s, String t) {
    Map<Character, Integer> s_map = makeMap(s);
    Map<Character, Integer> t_map = makeMap(t);
    
    if(s.length()!=t.length()) return false;

    for(int i=0; i<t.length(); i++){
      char c = t.charAt(i);
      if(!s_map.containsKey(c)) return false;
      if(s_map.get(c)!=t_map.get(c)) return false;
    }
    return true;
  }

  public Map<Character, Integer> makeMap(String str){
    Map<Character, Integer> map = new HashMap<>();
    for(int i=0; i<str.length(); i++){
      char c = str.charAt(i);
      if(map.containsKey(c)) map.put(c, map.get(c)+1);
      else map.put(c, 1);
    }
    return map;
  }
}
// s_map
{a=1913, b=2003, c=2000, d=1916, e=1978, f=1880, g=1949, h=1943, i=1949, j=1891, k=1923, 
        l=1922, m=1936, n=1978, o=1869, p=1874, q=1875, r=1985, s=1897, t=1838, u=1879, 
        v=1905, w=1940, x=1942, y=1915, z=1900}
// t_map        
{a=1913, b=2003, c=2000, d=1916, e=1978, f=1880, g=1949, h=1943, i=1949, j=1891, k=1923, 
        l=1922, m=1936, n=1978, o=1869, p=1874, q=1875, r=1985, s=1897, t=1838, u=1879, 
        v=1905, w=1940, x=1942, y=1915, z=1900}
        
50000
50000
// if(s.length()!=t.length()) return false;        
false

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

Arrays.sort๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€์ดํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. HashTable๋กœ์˜ ๊ตฌํ˜„๋งŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์–ด์„œ ์˜คํžˆ๋ ค ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ์ด๊ฒŒ ๋” ๋น ๋ฅธ ์ ‘๊ทผ๋ฒ•์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public boolean isAnagram(String s, String t) {
        char[] sChars = s.toCharArray();
        char[] tChars = t.toCharArray();
        Arrays.sort(sChars);
        Arrays.sort(tChars);
        return Arrays.equals(sChars, tChars);
    }
}

Hash Table์„ ์ด์šฉํ•œ ๋ฐฉ์‹๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. .getOrDefault() ๋ฉ”์„œ๋“œ๋กœ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ณ  ๋ฌธ์ž์—ด s์˜ ์š”์†Œ๋กœ map์— ์ถ”๊ฐ€, t์˜ ์š”์†Œ๋กœ map์—์„œ ์ฐจ๊ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” value์˜ ๊ฐ’์ด 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ๋‹ค anagram์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ false๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public boolean isAnagram(String s, String t) {
        Map<Character, Integer> count = new HashMap<>();
        
        for (char x : s.toCharArray()) {
            count.put(x, count.getOrDefault(x, 0) + 1);
        }
        
        for (char x : t.toCharArray()) {
            count.put(x, count.getOrDefault(x, 0) - 1);
        }
        
        for (int val : count.values()) {
            if (val != 0) {
                return false;
            }
        }
        
        return true;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

.getOrDefault(x, 0)๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋ฅผ ๊ทธ ๋™์•ˆ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณต๋ถ€๋ฅผ ์•ˆํ•˜๊ณ  ์žˆ์–ด์„œ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ๋ณ„๋กœ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋ฆฌํ•  ํ•„์š”์„ฑ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.



383. Ransom Note

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด ransomNote์™€ magazine๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ransomNote๋กœ magazine์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ฌธ์ž์—ด์€ ๋ชจ๋‘ ์˜์–ด ์†Œ๋ฌธ์ž๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

Hash Table์„ ์ด์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ransomNote์™€ magazine์„ map์œผ๋กœ ๋งŒ๋“ค๊ณ  ransomNote๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> ransomNote_map = makeMap(ransomNote);
        Map<Character, Integer> magazine_map = makeMap(magazine);

        for(int i=0; i<ransomNote.length(); i++){
            char c = ransomNote.charAt(i);
            if(!magazine_map.containsKey(c)) return false;
            if(ransomNote_map.getOrDefault(c,0)>magazine_map.getOrDefault(c,0)) return false;
        }
        return true;
    }

    public Map<Character, Integer> makeMap(String str){
        Map<Character, Integer> map = new HashMap<>();
        for(int i=0; i<str.length(); i++){
            char c = str.charAt(i);
            if(map.containsKey(c)) map.put(c, map.get(c)+1);
            else map.put(c, 1);
        }
        return map;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์ œ๊ฐ€ ํ‘ผ ์ ‘๊ทผ๋ฒ•๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ .toCharArray()๋ฅผ ์ด์šฉํ•œ ํ’€์ด์ž…๋‹ˆ๋‹ค.

  • ๋จผ์ €, magazine ๋ฌธ์ž์—ด์—์„œ ๊ฐ ๋ฌธ์ž์˜ ์ถœํ˜„ ๋นˆ๋„์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด charCounts๋ผ๋Š” ๊ธธ์ด 26์˜ ์ •์ˆ˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์†Œ๋ฌธ์ž ์˜์–ด ์•ŒํŒŒ๋ฒณ์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ, magazine ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋ฌธ์ž์˜ ์ถœํ˜„ ๋นˆ๋„์ˆ˜๋ฅผ charCounts์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ํ›„, ransomNote ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋ฌธ์ž๊ฐ€ charCounts์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ charCounts์— ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์—†๋‹ค๋ฉด, ransomNote๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, charCounts์—์„œ ํ•ด๋‹น ๋ฌธ์ž์˜ ์ถœํ˜„ ๋นˆ๋„์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ค„์ž…๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ransomNote์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ˆœํšŒํ–ˆ๋‹ค๋ฉด, ransomNote๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] charCounts = new int[26]; // Assuming lowercase English letters
        
        for (char c : magazine.toCharArray()) {
            charCounts[c - 'a']++;
        }

        for (char c : ransomNote.toCharArray()) {
            if ( !(charCounts[c - 'a'] > 0 ) ) {
                return false;
            } 
                charCounts[c - 'a']--;
        }
        
        return true;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๊ณผ์ œ์—์„œ๋Š” Hash Table๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์žˆ์—ˆ์ง€๋งŒ ๊ตฌํ˜„์ด ์‰ฌ์šด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.



219. Contains Duplicate 2

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋ฐฐ์—ด nums์™€ ์ •์ˆ˜ k๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฑฐ๋ฆฌ k ๋‚ด์— ๋–จ์–ด์ ธ ์žˆ๋Š” ๋™์ผํ•œ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

HashMap์„ ์ด์šฉํ•œ ํ’€์ด์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—์„œ ๋™์ผํ•œ ๊ฐ’์ด ๋‚˜์˜ค๋ฉด ์š”์†Œ๋Š” ํ‚ค๋กœ ๊ทธ ์ธ๋ฑ์Šค๋Š” ๊ฐ’์„ list๋กœ ๋ฐ›์•„์„œ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

class Solution {
  public boolean containsNearbyDuplicate(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    for(int i=0; i<nums.length; i++){
      if(map.containsKey(nums[i])){
        int a = map.get(nums[i]);
        if(i-a<=k) return true;
      }
      map.put(nums[i], i);
    }
    return false;
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

HashTable ๋ฐฉ์‹์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค ํ’€์ด์™€ ๋น„์Šทํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ(sliding window) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ HashTable ๋ฐฉ์‹๋ณด๋‹ค ๋นจ๋ž๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋‹ค์†Œ ์ž‘์•˜์Šต๋‹ˆ๋‹ค.

  • ์œˆ๋„์šฐ์˜ ์•ž์ชฝ์€ i ๋ฒˆ์งธ ์š”์†Œ์ด๋ฉฐ, ๋’ค์ชฝ์€ k ๊ฑฐ๋ฆฌ๋งŒํผ ๋–จ์–ด์ง„ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ์œˆ๋„์šฐ ๋‚ด์— ์žˆ๋Š” ์š”์†Œ๋“ค์€ Set์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ Set์— ์ถ”๊ฐ€ํ•  ๋•Œ, add() ๋ฉ”์„œ๋“œ๊ฐ€ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ด๋ฏธ Set์— ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ค‘๋ณต๋œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฏ€๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • for ๋ฃจํ”„์—์„œ return true๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด, ์ค‘๋ณต๋œ ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
public boolean containsNearbyDuplicate(int[] nums, int k) {
  Set<Integer> set = new HashSet<Integer>();
  for(int i = 0; i < nums.length; i++){
      if(i > k) set.remove(nums[i-k-1]);
      if(!set.add(nums[i])) return true;
  }
  return false;
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์ค‘๋ณต๋œ ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ์™€ ๊ฐ™์ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด, HashTable๋ณด๋‹ค ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์ด ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต๊ฐ„ ๋ณต์žก๋„์™€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.



1. Two Sum

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • nums ๋ฐฐ์—ด์—์„œ target ๊ฐ’์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค ์ˆœ์„œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • 167๋ฒˆ ๋ฌธ์ œ์™€ ๋‹ฌ๋ฆฌ nums๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ๋‚ด ์š”์†Œ๋Š” ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ for๋ฌธ์œผ๋กœ ํ’€์ดํ–ˆ๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ O(n^2) ๋ฏธ๋งŒ ๊ทธ๋ฆฌ๊ณ  Hash Table์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n^2)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
  public int[] twoSum(int[] nums, int target) {
    List<Integer> list = new ArrayList<>();
    for(int i:nums){
      list.add(i);
    }
    int i=0, a=0, b=0;
    for(i=0; i<nums.length; i++){
      a = target-nums[i];
      b = list.lastIndexOf(a);
      if(a>0 && b!=-1 && b!=i){
        break;
      }
    }
    return new int[]{i, b};
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

Hash Table์„ ์ด์šฉํ•œ ํ’€์ด์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์™œ ๊ตณ์ด Map ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ํ‚ค-๊ฐ’ ์Œ ์กฐํšŒ์ด๋ฏ€๋กœ ์˜คํžˆ๋ ค ๋น ๋ฅธ ํ’€์ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋จผ์ € HashMap ์•ˆ์— target๊ณผ์˜ ์ฐจ์ด๋งŒํผ์„ ๊ฐ€์ง€๋Š” ํ‚ค ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์ธ๋ฑ์Šค ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์—†๋‹ค๋ฉด, i์˜ ๊ฐ’์„ ํ‚ค๋กœ ํ•˜๋Š” ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> numMap = new HashMap<>();
        int n = nums.length;

        for (int i = 0; i < n; i++) {
            int complement = target - nums[i];
            if (numMap.containsKey(complement)) {
                return new int[]{numMap.get(complement), i};
            }
            numMap.put(nums[i], i);
        }

        return new int[]{}; // No solution found
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๋ชจ๋“  ํ‚ค๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ณ  ํ›„๋ณด ํ‚ค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค HashMap์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค๋Š” ๊ฒฐ๋ก ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



150. Evaluate Reverse Polish Notation

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • Polish Notation tokens์ด ์ฃผ์–ด์ง€๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์ผ์€ ์—†๊ณ , ๋‹ต๊ณผ ๋ชจ๋“  ์ค‘๊ฐ„ ๊ณ„์‚ฐ์€ 32๋น„ํŠธ ์ •์ˆ˜๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์™œ ์—ญ ํด๋ž€๋“œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์ฐพ๋‹ค๊ฐ€ ์œ„ํ‚ค ๊ธ€์„ ํ† ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. stack์„ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„์œผ๋กœ ๊ด„ํ˜ธ๊ฐ€ ๋งŽ์€ ๊ณ„์‚ฐ์‹์—์„œ ์˜คํžˆ๋ ค ์—ญ ํด๋ž€๋“œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ„์‚ฐ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • EmptyStackException์ด ๋ฐœ์ƒ
    • Character.isDigit๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ -11์„ ์ˆซ์ž๋กœ ๋ณด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
class Solution {
  public int evalRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    int next;
    for(String s:tokens){
      if(Character.isDigit(s.charAt(0))){
        stack.push(Integer.parseInt(s));
      }
      else{
        int b = stack.pop();
        int a = stack.pop();

        if("+".equals(s)) stack.push(a+b);
        else if("-".equals(s)) stack.push(a-b);
        else if("*".equals(s)) stack.push(a*b);
        else stack.push(a/b);
      }
      System.out.println(stack);
    }
    return stack.pop();
  }
}
์‹œ๋„ 2

๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ EmptyStackException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก Character.isDigit ๋Œ€์‹  ์‚ฌ์น™์—ฐ์‚ฐ ๊ธฐํ˜ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์„œ ์กฐ๊ฑด์„ ๊ฑฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

if("+".equals(s) || "-".equals(s) || "*".equals(s) || "/".equals(s))

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

๋‚˜๋จธ์ง€ ์ „์ฒด์ ์ธ ํ’€์ด๋Š” Stack ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋นผ๊ฑฐ๋‚˜ ์‚ฌ์น™์—ฐ์‚ฐ์„ ๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ set์— ๋„ฃ์–ด์„œ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง„๋‹ค๋ฉด ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ณ„์‚ฐ๋ถ€๋ถ„์„ ๋ฉ”์„œ๋“œ๋กœ ๋นผ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
Deque๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋„ ์žˆ์—ˆ๋Š”๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ Stack ๊ตฌ์กฐ๋งŒ์„ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋ณด๋ฉด Deque๋ฅผ ์‚ฌ์šฉํ•œ ํ’€์ด๋„ ๊ฝค ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Solution {
  public int evalRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    Set<String> ops = Set.of("+", "-", "*", "/");

    for (String s : tokens) {
      if (ops.contains(s)) {
        int a = stack.pop();
        int b = stack.pop();
        int c = 0;

        switch(s) {
          case "+" -> {c = b + a;}
          case "-" -> {c = b - a;}
          case "*" -> {c = b * a;}
          case "/" -> {c = b / a;}
        }
        stack.push(c);
      }
      else stack.push(Integer.parseInt(s));
    }
    return stack.peek();
  }
}

// TC: O(n), SC: O(n)

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

Deque๋Š” ์Šคํƒ๊ณผ ํ์˜ ํ˜•ํƒœ ๋ชจ๋‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์–‘์ชฝ ๋์—์„œ ์›์†Œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ArrayDeque๋Š” ๋™์ ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ Deque ๊ตฌํ˜„์ฒด์ด๋ฉฐ, LinkedList๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ Deque ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์Šคํƒ ๋˜๋Š” ํ๋ณด๋‹ค Deque๋ฅผ ์ผ์„ ๋•Œ ๋” ์ ํ•ฉํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ?๋ผ๋Š” ์งˆ๋ฌธ์— ChatGPT๋Š” ๋‹ต์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.


155. Min Stack

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์Šคํƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ๋กœ push, pop, top ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ๋™์‹œ์— ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Input
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

Output
[null,null,null,null,-3,null,0,-2]

Explanation
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // return -3
minStack.pop();
minStack.top();    // return 0
minStack.getMin(); // return -2

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

๊ธฐ์กด์— ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๊ณ ๋ฏผํ•ด๋ดค์„ ๋•Œ LinkedList๋Š” ์ฃผ์†Œ๋กœ ๋‹ค์Œ ๋ฆฌ์ŠคํŠธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ฐ˜๋ฉด, ArrayList๋Š” ์„ ํ˜• ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— O(n)๋งŒํผ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌดํ•œํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ LinkedList์˜ ๊ฒฝ์šฐ ๋” ๋ฌดํ•œํžˆ ์ƒˆ๋กœ์šด ์ž๋ฃŒ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ArrayList๋Š” ์ž๋ฃŒ์˜ ์‚ฝ์ž…, ์‚ญ์ œ ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ˆœ stack์˜ ๊ตฌํ˜„์ด์ง€๋งŒ, ์ด stack์„ ๋ˆ„๊ตฐ๊ฐ€ ์“ด๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— LinkedList๋กœ stack์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

class MinStack {
  LinkedList<Integer> list;

  public MinStack() {
    list = new LinkedList<>();
  }

  public void push(int val) {
    list.push(val);
  }

  public void pop() {
    list.removeFirst();
  }

  public int top() {
    return list.peekFirst();
  }

  public int getMin() {
    LinkedList<Integer> sortedList =  new LinkedList<>(list);
    Collections.sort(sortedList);
    return sortedList.peekFirst();
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

TplusMin๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋‘์–ด min ๊ฐ’๋„ ์ €์žฅํ•˜๋ฉด์„œ ๋งˆ์ง€๋ง‰์— getMin()์ฒ˜๋ฆฌ์‹œ ๋ณ„๋„ ์ •๋ ฌ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์ด ํ›จ์”ฌ ํšจ์œจ์ ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‹จ์ˆœํžˆ push ์ฒ˜๋ฆฌ์—์„œ๋งŒ ์‹ ๊ฒฝ์„ ์จ๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

class MinStack {
    LinkedList<TplusMin> stack;
    private class TplusMin {
        int val;
        int min;
        public TplusMin(int val, int min) {
            this.val = val;
            this.min = min;
        }
    }

    public MinStack() {
        stack = new LinkedList<>();
    }
    
    public void push(int val) {
        int newMin;
        if (stack.size() == 0){
            newMin = val;
        }
        else {
            int currentMin = stack.getFirst().min;
            newMin = val < currentMin ? val : currentMin;
        }
        stack.addFirst(new TplusMin(val, newMin));
    }
    
    public void pop() {
        stack.removeFirst();
    }
    
    public int top() {
        return stack.peekFirst().val;
    }
    
    public int getMin() {
        return stack.peekFirst().min;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

๋‹จ์ˆœํžˆ stack์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ list์— ์ €์žฅ๋  ๊ฐ’์„ 1๊ฐ€์ง€ ํƒ€์ž…์ด ์•„๋‹Œ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ์›ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”๊ณ  ๊ผญ ์ž๋ฃŒ๊ตฌ์กฐ ์•„๋‹ˆ์—ฌ๋„ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋„ ๊ฐ„๋‹จํ•œ class ๋‹จ์œ„ ๊ฐ์ฒด๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.



3. Longest Substring Without Repeating Characters

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋ฐ˜๋ณต์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด๋กœ ์ž˜๋ž์„ ๋•Œ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

๋ง๊ทธ๋Œ€๋กœ substringํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ์—ˆ๋Š”๋ฐ index ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ ์ด ์ ‘๊ทผ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‹œ๋„ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int answer = 1;
        for(int i=0; i<s.length()-1; i++){
            int j=i+1;
            while(j<s.length()){
                j++;
                String substring = s.substring(i,j);
                if(substring.indexOf(""+s.charAt(j))==-1){
                    answer = Math.max(answer, j-i);
                }
                else break;                
            }
        }
        return answer;
    }
}

์‹œ๋„ 2

209๋ฒˆ ๋ฌธ์ œ์—์„œ ๋ฐฐ์šด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ๊ณ ์ • ํฌ๊ธฐ์˜ ์œˆ๋„์šฐ๋ฅผ ์›€์ง์ด๋ฉด์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„ ๊ตฌ๊ฐ„์„ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ๋‚ด์—์„œ i์™€ j ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ํ˜•์„ฑํ•˜๊ณ , seen ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž์˜ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • i๋Š” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ์™ผ์ชฝ ๋์„, j๋Š” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ์˜ค๋ฅธ์ชฝ ๋์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์ด ๋•Œ j๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ 128์€ ์•„์Šคํ‚ค ์ฝ”๋“œ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n^2)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
    class Solution {
    public int lengthOfLongestSubstring(String s) {
      int answer = 0;
      for (int i=0; i<s.length(); i++) {
        boolean[] seen = new boolean[128];  
        int j=i;
        while (j<s.length() && !seen[s.charAt(j)]) {
          seen[s.charAt(j)] = true;
          j++;
        }
        answer = Math.max(answer, j-i); 
      }
      return answer;
    }
    }
    

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์œ„์˜ ํ’€์ด์™€ ๋น„์Šทํ•œ๋ฐ ์ด ๊ฒฝ์šฐ๋Š” int[] ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๋น„๊ต์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int maxLength = 0;
        int[] charIndex = new int[128];
        Arrays.fill(charIndex, -1);
        int left = 0;
        
        for (int right = 0; right < n; right++) {
            if (charIndex[s.charAt(right)] >= left) {
                left = charIndex[s.charAt(right)] + 1;
            }
            charIndex[s.charAt(right)] = right;
            maxLength = Math.max(maxLength, right - left + 1);
        }
        
        return maxLength;
    }
}

4. ์ƒ๊ฐํ•ด๋ณด๊ธฐ

์‹ค์ƒ ๋‹จ์–ด๊ฐ€ ๋งž๋Š”์ง€ ๋‹ค ํ™•์ธํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฐจํ”ผ ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋ฌธ์ž๋กœ ์ฒดํฌํ•œ๋‹ค๊ณ  ํ•ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ฐœ๋…๊ณผ ๋ฐฉ๋ฒ•๋“ค์„ ์ˆ™์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€



209. Minimum Size Subarray Sum

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์˜ ํ•ฉ์œผ๋กœ target์ด ๋˜๊ธฐ ์œ„ํ•œ ์„œ๋ธŒ ๋ฐฐ์—ด์˜ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด nums๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธŒ๋ฐฐ์—ด์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” 0์„ return ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n) ๋˜๋Š” O(n log n)์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์Šต๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

์ด์ค‘๋ฃจํ”„ ๋ฐ–์— ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„์„œ ์ด๋ ‡๊ฒŒ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ญ์‹œ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        if(Arrays.binarySearch(nums, target)>=0) return 1;
        int j=1, cnt=0;
        boolean b = false;
        for(int i=0; i<nums.length; i++){
            int value = nums[i];
            j = i+1;
            while(true){
                if(j<=nums.length-1) value += nums[j];
                if(target==value){
                    b=true;
                    break;
                }
                if(j==nums.length-1 || target<value) break;
            }
            if(b) cnt = j-i+1;
        }
        return cnt;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์ด์šฉํ•œ ํ’€์ด์—ˆ๋Š”๋ฐ, ์•ž์—์„œ ๋‚˜์˜ ํ’€์ด์™€ ๊ฐ™์ด for๋ฌธ๊ณผ while๋ฌธ์„ ํ•จ๊ป˜ ์“ฐ๋Š” ๋ฐฉ์‹์ธ๋ฐ ํšจ์œจ์ ์ด๋ผ๋Š” ๋ถ€๋ถ„์ด ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์„œ๋ธŒ๋ฐฐ์—ด์ด ์—†๋Š” ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์ด target ์ด์ƒ์ด ๋˜๋„๋ก left ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉด์„œ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        int left = 0;
        int minLength = Integer.MAX_VALUE;
        int currentSum = 0;

        for (int right = 0; right < nums.length; right++) {
            currentSum += nums[right];

            while (currentSum >= target) {
                minLength = Math.min(minLength, right - left + 1);
                currentSum -= nums[left];
                left++;
            }
        }

        if (minLength != Integer.MAX_VALUE) 
            return minLength;
        else 
            return 0;
    }
}

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

๋‘ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•๊ณผ๋Š” ์•ฝ๊ฐ„ ์ƒ์ดํ–ˆ๋Š”๋ฐ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ข€ ๋” ๋Šฅ์ˆ™ํ•ด์ ธ์•ผ ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.



167. Two Sum 2 Input Array Is Sorted

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด ๋‚ด ๋‘ ์š”์†Œ๋ฅผ ๋”ํ•œ ๊ฐ’์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋•Œ ๊ทธ ๋ฐฐ์—ด ๋‚ด ๋‘ ์š”์†Œ์˜ ์ˆœ์„œ ์Œ์„ return ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

Arrays.binarySearch๋กœ ์ง์ด ๋˜๋Š” index๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ํ’€์—ˆ์„ ๋•Œ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์ œ๋Š” ๋‹ค ํ†ต๊ณผํ–ˆ์ง€๋งŒ, [5,25,75]์—์„œ 100์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์—์„œ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
  • output์ด [1,-3]์ด ๋‚˜์™”๋Š”๋ฐ indexOf์™€ ์ฐฉ๊ฐํ•˜๊ณ  -1๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • Arrays.binarySearch์€ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ์Œ์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ key์˜ ์ •ํ™•ํ•œ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ key๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•  ์œ„์น˜์— ๋Œ€ํ•œ ์Œ์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i=0, j=0;
        for(i=0; i<numbers.length; i++){
            j = Arrays.binarySearch(numbers, target-numbers[i]);
            if(j>0) break;
        }
        return new int[]{i+1, j+1};
    }
}
์‹œ๋„ 2

์œ„์—์„œ Arrays.binarySearch์˜ ์Œ์ˆ˜ ๋ฌธ์ œ, ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์—ฐ์†์œผ๋กœ ์žˆ์„ ๋•Œ์˜ ๊ฐ™์€ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜๋ฌธ์ œ, ๋ฐ˜ํ™˜ ๋ฐฐ์—ด์˜ ์ •๋ ฌ๋ฌธ์ œ ๋“ฑ์„ ๊ณ ๋ คํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i=0, j=0;
        for(i=0; i<numbers.length; i++){
            j = Arrays.binarySearch(numbers, target-numbers[i]);
            if(j>=0 && i!=j) break;
        }
        if(i<j) return new int[]{i+1, j+1};
        else return new int[]{j+1, i+1};
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

์ฃผ์–ด์ง„ nums ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ๊ฐ’์ด๋ฏ€๋กœ ์–‘์ชฝ์˜ ๊ฐ’์„ ๋”ํ•ด์„œ target๋ณด๋‹ค ์ž‘์€์ง€ ํฐ์ง€์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋„ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ณ  ์ด ์ ‘๊ทผ๋ฒ•์„ ๊ธฐ์–ตํ•ด๋‘๋Š”๊ฒŒ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

class Solution {
  public int[] twoSum(int[] nums, int target) {
    int l = 0, r = nums.length - 1;
    while (nums[l] + nums[r] != target) {
      if (nums[l] + nums[r] < target)
        l++;
      else
        r--;
    }
    return new int[]{l + 1, r + 1};
  }
}

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

์ฐธ๊ณ ํ•œ ํ’€์ด ์ž‘์„ฑ์ž๊ฐ€ ์“ด ๋‚ด์šฉ์—์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ณ ๋ คํ•ด๋ณผ ๋‚ด์šฉ์œผ๋กœ ๋‹ค์Œ ๋‚ด์šฉ๋“ค์„ ์ถ”์ฒœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋‘ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์ง„ ๊ฒ€์ƒ‰
  • ๋‘ ๊ฐœ(๋˜๋Š” ์„ธ ๊ฐœ)์˜ ํฌ์ธํ„ฐ
  • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
    • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์œˆ๋„์šฐ์˜ ์‹œ์ž‘๊ณผ ๋์„ ์กฐ์ ˆํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ค„์ด๊ณ , ๋ฌธ์ œ์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋ฉฐ, ํšจ์œจ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ˆœํšŒ


125. Valid Palindrome

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • Palindrome์ธ์ง€๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ† ๋งˆํ† , ๊ธฐ๋Ÿฌ๊ธฐ, ์šฐ์˜์šฐ ๊ฐ™์€ ๋ฌธ์ž์—ด ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • true or false๋กœ ๋ฐ˜ํ™˜
  • ํŠน์ˆ˜๋ฌธ์ž์™€ ๊ณต๋ฐฑ์€ ์ œ์™ธํ•˜๊ณ  ์˜์ž ๋Œ€์†Œ๋ฌธ์ž๋Š” ๋™์ผํ•˜๊ฒŒ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • " " ๋นˆ ๋ฌธ์ž์—ด๋„ Palindrome์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

์‹œ๋„ 1

๋ฌธ์ž์—ด์„ char[] ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋’ค์˜ ๋ฐฐ์—ด์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด ๊ฒฝ์šฐ, 458 / 485 ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ 0P๋Š” ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฌธ์ œ์—์„œ Alphanumeric characters include letters and numbers.๋กœ ์ˆซ์ž๋„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
class Solution {
    public boolean isPalindrome(String s) {
        if(s.isEmpty()) return true;
        int end = s.length()-1;
        char[] arr = s.toCharArray();
        for(int i=0; i<arr.length/2; i++){
            if(!(arr[i] >= 'A' && arr[i] <= 'Z') && !(arr[i] >= 'a' && arr[i] <= 'z'))
                continue;
            while(true){
                if((arr[end] >= 'A' && arr[end] <= 'Z') || (arr[end] >= 'a' && arr[end] <= 'z'))
                    break;
                else end--;    
            }
            if(Character.toLowerCase(arr[i]) != Character.toLowerCase(arr[end]))            
                return false;
            else end--;
        }
        return true;
    }
}
์‹œ๋„ 2

์œ„ ์ฝ”๋“œ์—์„œ ์ˆซ์ž๋ฅผ ๋‹ค์‹œ ๋ฐ˜์˜ํ•œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • !(start >= 0 && start <= 9) && !(start >= 'a' && start <= 'z')
class Solution {
    public boolean isPalindrome(String s) {
        if(s.isEmpty()) return true;
        int end = s.length()-1;
        char[] arr = s.toCharArray();
        for(int i=0; i<arr.length/2; i++){
            int start = Character.toLowerCase(arr[i]);
            int compare = Character.toLowerCase(arr[end]);
            if(!(start >= 0 && start <= 9) && !(start >= 'a' && start <= 'z'))
                continue;
            while(true){
                if((compare >= 0 && compare <= 9) || (compare >= 'a' && compare <= 'z'))
                    break;
                else end--;    
            }
            if(start != compare) return false;
            else end--;
        }
        return true;
    }
}
์‹œ๋„ 3

์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. while๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ฆฌ s์˜ ์ˆซ์ž์™€ ์˜๋ฌธ์ž ์™ธ ๋‹ค๋ฅธ ๋ฌธ์ž๋Š” ๊ณต๋ฐฑ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ์ด ๊ฒฝ์šฐ, 462 / 485 ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ 0P๋Š” ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
    • if(!(arr[i] >= 0 && arr[i] <= 9) && !(arr[i] >= 'a' && arr[i] <= 'z')) arr[i]=' ';
    • ์ด ๋ถ€๋ถ„์—์„œ 0์„ ๊ณต๋ฐฑ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, if(!(arr[i] >= '0' && arr[i] <= '9') && !(arr[i] >= 'a' && arr[i] <= 'z')) arr[i]=' '; }๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ†ต๊ณผ๋Š” ํ–ˆ์ง€๋งŒ ๋งˆ์Œ์— ๋“œ๋Š” ํ’€์ด๋Š” ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
class Solution {
    public boolean isPalindrome(String s) {
        if(s.isEmpty()) return true;
        s = s.toLowerCase();
        char[] arr = s.toCharArray();
        for(int i=0; i<arr.length; i++){
            if(!(arr[i] >= '0' && arr[i] <= '9') && !(arr[i] >= 'a' && arr[i] <= 'z')) arr[i]=' ';
        }
        String str = String.valueOf(arr).replaceAll(" ", "");
        arr = str.toCharArray();
        for(int i=0, j=arr.length-1; i<arr.length/2; i++, j--){
            if(arr[i]!=arr[j]) return false;
        }
        return true;
    }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

Character.isLetterOrDigit๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ํ™•์‹คํžˆ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๊ฐ€ ๋ฌธ์ž์—ด๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž ์œ„์น˜๋ฅผ left์™€ right๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ๋น„๊ตํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
class Solution {
   public boolean isPalindrome(String s) {
        if (s.isEmpty()) {
            return true;
        }

        int left = 0;
        int right = s.length() - 1;

        while (left < right) {
            char leftChar = s.charAt(left);
            char rightChar = s.charAt(right);

            if (!Character.isLetterOrDigit(leftChar)) {
                left++;
            } else if (!Character.isLetterOrDigit(rightChar)) {
                right--;
            } else {
                if (Character.toLowerCase(leftChar) != Character.toLowerCase(rightChar)) {
                    return false;
                }
                left++;
                right--;
            }
        }

        return true;
    }
}

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ , ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ์ตœ๋Œ€ํ•œ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๋Š” ์„ ์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.



169. Majority Element

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ€ ๋นˆ๋„ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์ตœ๋นˆ๊ฐ’์€ ์ ์–ด๋„ ๋ฐฐ์—ด์˜ ๊ธธ์ด/2 ์ด์ƒ์˜ ๋นˆ๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„ O(n), ๊ณต๊ฐ„๋ณต์žก๋„ O(1)์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

๋จผ์ € ์ œ๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ map์— ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ†ต๊ณผ๋Š” ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ์—์„œ ๊ณ ๋ คํ•ด๋ด์•ผํ•  ๋ณต์žก๋„ ๋ถ€๋ถ„์—์„œ๋Š” ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n + n log n)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
class Solution {
  public int majorityElement(int[] nums) {
    int limit = nums.length/2;
    Map<Integer, Integer> map = new HashMap<>();
    for(int i:nums){
      if(map.containsKey(i) map.put(i, map.get(i)+1);
      else map.put(i, 1);
    }
    List<Integer> keySet = new ArrayList<>(map.keySet());
    keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
    return keySet.get(0);
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

Arrays.sort(nums) ์ด์šฉํ•˜๊ธฐ
๊ฐ€์žฅ ๋จผ์ € ๋ณธ ํ’€์ด๋Š” ์ด ๋ฐฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ง€๋งŒ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ limit ๋ถ€๋ถ„์„ ๋ฌธ์ œ ํ’€๋ฉด์„œ ์žŠ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๋นˆ๋„ ๊ฐ’์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด/2 ์ด์ƒ์˜ ๋นˆ๋„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ๋กœ ์ค‘์•™๊ฐ’๋งŒ ๋„์ถœํ•ด๋„ ๊ฐ’์€ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ์‹œ๊ฐ„, ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ์•„๋‹ˆ์˜€์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        return nums[n/2];
    }
}

Moore Voting Algorithm
๊ณผ๋ฐ˜์ˆ˜ ์š”์†Œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ Moore Voting Algorithm์ž…๋‹ˆ๋‹ค.

  • ๋ณ€์ˆ˜ candidate๋ฅผ ๊ณผ๋ฐ˜์ˆ˜ ์š”์†Œ ํ›„๋ณด๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , count๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ count๊ฐ€ 0์ด๋ผ๋ฉด ํ˜„์žฌ ์š”์†Œ๋ฅผ candidate๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ํ˜„์žฌ ์š”์†Œ๊ฐ€ candidate์™€ ๊ฐ™๋‹ค๋ฉด count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด count๋ฅผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;
        int candidate = 0;
        
        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            if (num == candidate) {
                count++;
            } else {
                count--;
            }
        }
        return candidate;
    }
}

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

Moore Voting Algorithm์ด ์ƒ์†Œํ–ˆ๋Š”๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์œ„์—์„œ ๊ฐ€์žฅ ์ดํ•ด๋˜์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„์ด candidate = num; ๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ ์ฒ˜์Œ์— ๊ฐ’์„ ๋„ฃ๋Š” ๊ฑด ๋‹น์—ฐํ–ˆ์ง€๋งŒ ๊ฐ’์„ ๋„ฃ์€ ์ดํ›„์— ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋นˆ๋„๋กœ ๊ทธ ๊ฐ’(count)์„ ์ค„์ด๊ณ  0์ด ๋˜๋ฉด ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ํ›„๋ณด์ž๋กœ ๋„ฃ๋Š”๋‹ค๋Š”๊ฒŒ ์ฒ˜์Œ์— ์ดํ•ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์ œ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด 2,2,1,1,1,2,2์„ ๋„ฃ์–ด์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์˜คํžˆ๋ ค ์‰ฌ์› ๋Š”๋ฐ ๊ฒฐ๊ตญ์—๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ „์ œ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.



80. Remove Duplicates from Sorted Array 2

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ผํ•œ ์š”์†Œ๊ฐ€ 3๊ฐœ ์ด์ƒ ์—ฐ์†๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • 1,1,2,2,2,3์ผ ๋•Œ, 1,1,2,2,3,_์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ์š”์†Œ์˜ ์ˆ˜๋ฅผ returnํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

๋จผ์ € ์–ด๋–ป๊ฒŒ ํ’€์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ 26๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ตํžŒ ํฌ์ธํ„ฐ ๋ฐฉ์‹์œผ๋กœ ํ’€๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๋‘ ๋ฒˆ์งธ if๋ฌธ์—์„œ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค..

class Solution {
  public int removeDuplicates(int[] nums) {
    int a=1, cnt=0;
    for(int i=1; i<nums.length; i++){
      if(nums[i]==nums[i-1]) cnt++;
      if(cnt>=2 || nums[i]!=nums[i-1]){
        //cnt=0;
        nums[a++]=nums[i];
      }

    }
    return a;
  }
}

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length <= 2) {
            return nums.length;
        }
        int index = 2;
        for (int i = 2; i < nums.length; i++) {
            if (nums[i] != nums[index - 2]) {
                nums[index] = nums[i];
                index++;
            }
        }
        return index;
    }
}
  • ๋จผ์ € nums๊ฐ€ 2๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋‹น์—ฐํžˆ ๋ณ„๋„์˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ ๊ธธ์ด๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘๋˜๋Š” i์™€ index๋„ 2์˜ ๊ฐ’๋ถ€ํ„ฐ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

if (nums[i] != nums[index - 2]) {
    nums[index] = nums[i];
    index++;
}

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ ์‹ค์ œ๋กœ index๋กœ ๋“ค์–ด๊ฐ„ ๋ฐฐ์—ด๋“ค์€ ์ฐจ๊ณก์ฐจ๊ณก ์ค‘๋ณต์„ 2๊ฐœ๊นŒ์ง€ ํ—ˆ์šฉํ•œ ๊ฐ’๋“ค์ด๊ณ  nums[i]์˜ ๊ฐ’์ด ๊ธฐ์กด์— ๊ฐ’๋“ค๊ณผ ๋‹ค๋ฅธ ๊ฒฝ์šฐ(์ƒˆ๋กœ ์Œ“์€ ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅธ ๊ฒฝ์šฐ), nums[index] = nums[i];๋กœ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.



26. Remove Duplicates from Sorted Array

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด nums์˜ ์ค‘๋ณต๊ฐ’์„ ์ œ์™ธํ•œ ์š”์†Œ์˜ ์ˆ˜๋ฅผ returnํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์ค‘๋ณต๊ฐ’์€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

class Solution {
    public int removeElement(int[] nums, int val) {
        nums = Arrays.stream(nums).distinct().toArray();
        return nums.length;
    }
}

IDE์—์„œ์™€ ๋‹ฌ๋ฆฌ nums ๊ฐ’์˜ output์ด ์ค‘๋ณต๊ฐ’์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚˜์™€์„œ ๋‹ค์‹œ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(n)

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

class Solution {
    public int removeDuplicates(int[] nums) {
        int a=1;
        for(int i=1; i<nums.length; i++){
            if(nums[i]!=nums[i-1]){
                nums[a++]=nums[i];
            }
        }
        return a;
    }
}

nums์˜ ๊ฐ’์ด ์•ž์˜ ๊ฐ’๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด, ์ธ๋ฑ์Šค a ์œ„์น˜์— ๋Œ€์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

stream์—์„œ ์‚ฌ์šฉ๋˜๋Š” distinct()์™€ toArray()๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ณต๊ฐ„๋ณต์žก๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ข‹์ง€ ์•Š๊ฒŒ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ๋ณด๋‹ค๋Š” ์ฃผ์–ด์ง„ nums ๊ฐ์ฒด ๊ฐ’์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.



27. Remove Element

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • nums ๋ฐฐ์—ด๊ณผ ๋ฐฐ์—ด์—์„œ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • return ๊ฐ’์€ ๋ฐฐ์—ด๋กœ ์‚ญ์ œํ•œ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ์š”์†Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

class Solution {
    public int removeElement(int[] nums, int val) {
        int answer = 0;
        for(int i=0; i<nums.length; i++){
            if(nums[i]!=val){ 
                nums[answer] = nums[i];
                answer++;
            }    
        }
        return answer;
    }
}

์ฒ˜์Œ์— return ๊ฐ’๋งŒ ๊ณ ๋ คํ•ด์„œ for๋ฌธ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ nums[answer] = nums[i];์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ nums ๋ฐฐ์—ด๋„ ๋‹ค์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด val๊ณผ ๊ฐ™์ง€ ์•Š์€ ๊ฐ’๋“ค๋งŒ nums ๋ฐฐ์—ด ์•ž์— ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

class Solution {
    public int removeElement(int[] nums, int val) {
        int count=0; //variable for occurance
        int i=0; 
        int j=nums.length-1;
        while(i<nums.length){
            if(nums[i]==val){
               nums[i]=nums[j];
               nums[j]=-1;
               j--;
               count++;
            }
            else{
                i++;
            }
        }
        return nums.length-count;
    }
}

์ด ๋ฌธ์ œ๋„ ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•œ ๋ถ„๋„ ์žˆ์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์ด ๊ฒฝ์šฐ๋Š” ์ €์˜ ํ’€์ด์™€ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. val ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‹ค์‹œ nums ๋’ค์— ์š”์†Œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ์ƒˆ๋กœ์› ์Šต๋‹ˆ๋‹ค.

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ํ’€์ด๊ฐ€ ์ •๋ ฌ ๋ฌธ์ œ์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์ข€ ๋” ์ต์ˆ™ํ•ด์ง€๋„๋ก ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.



88. Merge Sorted Array

1. ๋ฌธ์ œ

๋ฌธ์ œ URL

  • nums1๊ณผ nums2๊ฐ€ ์ฃผ์–ด์ง€๊ณ  nums1 ์•ˆ์— ๋ณ‘ํ•ฉํ•œ ๋’ค ์ •๋ ฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ return ๊ฐ’์€ ์—†์Šต๋‹ˆ๋‹ค.

2. ๋‚˜์˜ ํ’€์ด

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i=0; i<n; i++){
            nums1[m+i] = nums2[i];
        }
        Arrays.sort(nums1);
    }
}

nums1์˜ ํฌ๊ธฐ๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ์—์„œ n+m์˜ ํฌ๊ธฐ๋กœ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— m๊ฐœ ์™ธ์˜ ๊ฐ’์€ 0์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•˜๊ณ  ๊ทธ ์ดํ›„์˜ ๊ฐ’๋งŒ nums2์—์„œ ๋ฐ›์•„์™€์„œ for๋ฌธ์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ํ›„ ๋งˆ์ง€๋ง‰ ์ •๋ ฌ์€ Arrays.sort ๋ฉ”์„œ๋“œ๋กœ ์ •๋ ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(n + m * log(m+n))
  • ๊ณต๊ฐ„๋ณต์žก๋„: O(1)

3. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1;
        int j = n - 1;
        int k = m + n - 1;
        
        while (j >= 0) {
            if (i >= 0 && nums1[i] > nums2[j]) {
                nums1[k--] = nums1[i--];
            } else {
                nums1[k--] = nums2[j--];
            }
        }
    }
}

๋‹ค๋ฅธ ํ’€์ด ์ค‘์— ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ณ  ์‹ ์„ ํ–ˆ๋˜ ์ ‘๊ทผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ  ํ‘ธ๋Š” ํ’€์ด๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n+m)์œผ๋กœ ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

  • ๋ณ€์ˆ˜ i, j, k๋ฅผ ๊ฐ๊ฐ nums1, nums2, ๋ณ‘ํ•ฉํ•œ nums2์˜ ์ธ๋ฑ์Šค๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ํ™œ์šฉํ•˜์—ฌ, ํฐ ๊ฐ’๋“ค์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ nums1 ๋ฐฐ์—ด์— ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋ณ‘ํ•ฉ์‹œ ๋” ํฐ ๊ฐ’์„ nums1 ๋ฐฐ์—ด์˜ ๋๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค k์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ nums1 ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ nums2 ๋ฐฐ์—ด์˜ ์š”์†Œ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ๋จผ์ € nums1[k] ์œ„์น˜์— ์ €์žฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” nums2[j] ๊ฐ’์„ nums1[k] ์œ„์น˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค, i, j, ๊ทธ๋ฆฌ๊ณ  k๋ฅผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.
  • nums2 ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋ชจ๋‘ nums1 ๋ฐฐ์—ด์— ํ•ฉ์น  ๋•Œ๊นŒ์ง€ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

4. ์ƒ๊ฐํ•ด ๋ณผ ๋ถ€๋ถ„

ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฒ•์„ ์ตํžˆ๊ฒŒ ๋œ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Arrays.sort๋ฅผ ์ด์šฉํ•œ ํ’€์ด๊ฐ€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง„๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  return ๊ฐ’์ด ๋ณ„๋„ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  nums1์— ๊ฐ’์— ๋ณ‘ํ•ฉ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์ „์ œ๊ฐ€ ๋‹ค๋ฅธ ์ฝ”๋“œํ…Œ์ŠคํŠธ ์‚ฌ์ดํŠธ์™€ ์ฐจ์ด๊ฐ€ ์žˆ์–ด ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์ฝ์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

results matching ""

    No results matching ""