Post

๐Ÿ’ช๐Ÿป programmers ๊ณ ๋“์  Kit - ์Šคํƒ(Stack), ํ(Queue)

๊ฐ™์€ ์ˆซ์ž๋Š” ์‹ซ์–ด - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ฐฐ์—ด์—์„œ ์—ฐ์†์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ˆซ์ž๋Š” ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ๊ณ  ์ „๋ถ€ ์ œ๊ฑฐํ•˜๋Š” ๋ฌธ์ œ. ๋‹จ, ๋ฐฐ์—ด arr์˜ ์›์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•จ.

1) stack ์„ ์–ธ

2) stack์— ๊ฐ’์ด ์—†๊ณ , stack ์ตœ์ƒ๋‹จ์˜ ๊ฐ’์ด arr ๋ฐฐ์—ด ๊ฐ’์ด ์•„๋‹ ๋•Œ stack์— ์‚ฝ์ž…

3) ์—ญ์ˆœ์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— stack ๊ฐ’ pop()์„ ํ†ตํ•ด ์ถœ๋ ฅ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
      
        Stack<Integer> stack = new Stack<>();
        
        for(int i=0;i<arr.length;i++)
        {
            if(stack.empty() || stack.peek()!=arr[i])
            {
                stack.push(arr[i]);
            }
        }
        int[] answer = new int[stack.size()];
        
        for(int i=stack.size()-1;i>=0;i--)
        {
            answer[i] = stack.pop();
        }
    
        return answer;
    }
}


๊ธฐ๋Šฅ ๊ฐœ๋ฐœ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๊ธฐ๋Šฅ ๊ฐœ์„  ์ž‘์—…์„ ์ˆ˜ํ–‰ ์ค‘์ด๋‹ค. ๊ฐ ๊ธฐ๋Šฅ์€ ์ง„๋„๊ฐ€ 100%์ผ ๋•Œ ์„œ๋น„์Šค์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค, ๋˜, ๊ฐ ๊ธฐ๋Šฅ์˜ ๊ฐœ๋ฐœ ์†๋„๋Š” ๋ชจ๋‘ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์•ž์— ์žˆ๋Š” ๊ธฐ๋Šฅ๋ณด๋‹ค ๋จผ์ € ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋•Œ ๋’ค์— ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ์•ž์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋  ๋•Œ ํ•จ๊ป˜ ๋ฐฐํฌ๋œ๋‹ค. ๋จผ์ € ๋ฐฐํฌ๋˜์–ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…์˜ ์ง„๋„๊ฐ€ ์ ํžŒ ์ •์ˆ˜ ๋ฐฐ์—ด progresses์™€ ๊ฐ ์ž‘์—…์˜ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ ํžŒ ์ •์ˆ˜ ๋ฐฐ์—ด speeds๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๊ฐ ๋ฐฐํฌ๋งˆ๋‹ค ๋ช‡ ๊ฐœ์˜ ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋˜๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

1) ArrayList์™€ Queue ์„ ์–ธ

2) ์ผ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด 100 - progresses[i]๋ฅผ ํ•œ ๋’ค, speeds[i] ๊ฐ’์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ๋˜ 2.XX์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ Math.ceil์„ ์ด์šฉํ•ด ์˜ฌ๋ฆผ์„ ํ•œ๋‹ค.

3) queue ๊ฐ’์ด ๋น„์ง€ ์•Š์œผ๋ฉด์„œ queue์˜ ์ตœ์ƒ๋‹จ์˜ ๊ฐ’์ด date ๊ฐ’ ๋ณด๋‹ค ์ž‘์„๊ฒฝ์šฐ List์— queue์˜ ํฌ๊ธฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ queue๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

4) queue์— date ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค.

5) answer ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ answerList.size()๋กœ ์„ ์–ธํ•œ ๋’ค, ๊ฒฐ๊ณผ๊ฐ’์— answerList.get(i)๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค.

  • ์ž‘์—…๋“ค์˜ ์ง„ํ–‰ ์ƒํ™ฉ: progresses = [93, 30, 55]
  • ์ž‘์—… ์†๋„: speeds = [1, 30, 5]

  1. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…:

    • ๋‚จ์€ ์ž‘์—…๋Ÿ‰: 100 - 93 = 7
    • ์™„๋ฃŒ ๋‚ ์งœ: 7 / 1 = 7์ผ
    • ํ ์ƒํƒœ: q = [7] (์ฒซ ๋ฒˆ์งธ ์ž‘์—…์˜ ์™„๋ฃŒ ๋‚ ์งœ)
  2. ๋‘ ๋ฒˆ์งธ ์ž‘์—…:

    • ๋‚จ์€ ์ž‘์—…๋Ÿ‰: 100 - 30 = 70
    • ์™„๋ฃŒ ๋‚ ์งœ: 70 / 30 = 2.333... โ†’ Math.ceil(2.333...) = 3์ผ
    • ํ ์ƒํƒœ: ํ˜„์žฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’(q.peek() = 7)๊ณผ ๋น„๊ต:
      • 7 > 3์ด๋ฏ€๋กœ, ๋‘ ๋ฒˆ์งธ ์ž‘์—…์€ ์ฒซ ๋ฒˆ์งธ ์ž‘์—…๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ.
      • ํ์— 3 ์ถ”๊ฐ€: q = [7, 3]
  3. ์„ธ ๋ฒˆ์งธ ์ž‘์—…:

    • ๋‚จ์€ ์ž‘์—…๋Ÿ‰: 100 - 55 = 45
    • ์™„๋ฃŒ ๋‚ ์งœ: 45 / 5 = 9์ผ
    • ํ ์ƒํƒœ: ํ˜„์žฌ ํ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’(q.peek() = 7)๊ณผ ๋น„๊ต:
      • 7 < 9์ด๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ๋ฐฐํฌ ๊ทธ๋ฃน์ด ์‹œ์ž‘๋จ.
      • ์ง€๊ธˆ๊นŒ์ง€ ํ์— ์Œ“์ธ ์ž‘์—… ์ˆ˜(q.size() = 2)๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€: answerList = [2].
      • ํ ์ดˆ๊ธฐํ™”: q.clear().
      • ์„ธ ๋ฒˆ์งธ ์ž‘์—…์˜ ์™„๋ฃŒ ๋‚ ์งœ ์ถ”๊ฐ€: q = [9].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> answerList = new ArrayList<>();
        Queue<Integer> q = new LinkedList<>();
        
        for(int i=0;i<speeds.length;i++)
        {
            double remain = (100-progresses[i])/(double)speeds[i];
            int date = (int)Math.ceil(remain);
            
            if(!q.isEmpty() && q.peek() < date)
            {
                answerList.add(q.size());
                q.clear();
            }
            q.offer(date);
        }
        answerList.add(q.size());
        
        int[] answer = new int[answerList.size()];
        
        for(int i=0;i<answer.length;i++)
        {
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
}


์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๊ด„ํ˜ธ๊ฐ€ ๋ฐ”๋ฅด๊ฒŒ ์ง์ง€์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์€ '(' ๋ฌธ์ž๋กœ ์—ด๋ ธ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ์ง์ง€์–ด์„œ ')' ๋ฌธ์ž๋กœ ๋‹ซํ˜€์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

  • "()()" ๋˜๋Š” "(())()" ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ด๋‹ค.
  • ")()(" ๋˜๋Š” "(()(" ๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ์ด๋‹ค.

'(' ๋˜๋Š” ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด s๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฌธ์ž์—ด s๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ด๋ฉด true๋ฅผ return ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ์ด๋ฉด false๋ฅผ return ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ

1) Character ํƒ€์ž…์œผ๋กœ stack ์„ ์–ธํ•˜๊ธฐ

2) ๋ฌธ์ž์—ด s์—์„œ s.charAt(i)์„ ํ†ตํ•ด ํ•œ๊ธ€์ž์”ฉ ์ถ”์ถœํ•˜๊ธฐ

3) '(' ํ•ด๋‹น ๋ฌธ์ž๋ผ๋ฉด stack์— push๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฝ์ž…

4) ')' ํ•ด๋‹น ๋ฌธ์ž๋ผ๋ฉด stack์— pop์„ ์ด์šฉํ•˜์—ฌ ๋นผ๊ธฐ, ์—ฌ๊ธฐ์„œ ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ(isEmpty()) ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด return false

5) return stack.isEmpty()๋ฅผ ํ†ตํ•ด ๋ชจ๋‘ ๋น„์—ˆ์„ ๋•Œ true, stack์— ๊ฐ’์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack<Character> stack = new Stack<>();
        
        for(int i=0;i<s.length();i++)
        {
            if(s.charAt(i)=='(')
            {
                stack.push('(');
            }
            else if(s.charAt(i)==')')
            {
                if(stack.isEmpty())
                {
                    return false;
                }
                stack.pop();
            }
        }

        return stack.isEmpty();
    }
}


ํ”„๋กœ์„ธ์Šค - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

1) ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์„ ์–ธ

2) priorities๋ฅผ pq์— ์ €์žฅ

3) ํ๊ฐ€ ๋น„์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€, priorities์˜ ๊ธธ์ด๋งŒํผ ๋ฐ˜๋ณต. ๋งŒ์•ฝ pq์˜ ์ตœ์ƒ๋‹จ ๊ฐ’๊ณผ priorites์˜ ํ•ด๋‹น ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ํ์—์„œ ๊บผ๋‚ด๊ณ  answer๊ฐ’ ์ฆ๊ฐ€

4) location๊ณผ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋ฐ˜ํ™˜ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        
        for(int i=0;i<priorities.length;i++)
        {
            pq.offer(priorities[i]);
        }
        
        while(!pq.isEmpty())
        {
            for(int i=0;i<priorities.length;i++)
            {
                if(pq.peek() == priorities[i])
                {
                    pq.poll();
                    answer++;
                    if(location == i)
                    {
                        return answer;
                    }
                }
            }
        }
        
        return answer;
    }
}


๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int size = truck_weights.length; //๋‹ค๋ฆฌ ์œ„๋ฅผ ๊ฑด๋„ˆ์•ผ ํ•  ํŠธ๋Ÿญ์˜ ์ˆ˜
        int current = 0; // ๋‹ค๋ฆฌ ์œ„์— ์˜ฌ๋ผ๊ฐ„ ํŠธ๋Ÿญ ๋ฌด๊ฒŒ
        int idx = 0;
        
        Queue<Integer> q = new LinkedList<>();
        
        do{
            if(q.size() == bridge_length)
            {
                current -= q.poll(); // ๋‹ค๋ฆฌ ์œ„์— ํŠธ๋Ÿญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„Œ ํŠธ๋Ÿญ์„ ํ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ๋ฌด๊ฒŒ๋ฅผ ๋นผ์คŒ
            }
            if(idx<size && current + truck_weights[idx] <= weight) // ๋‹ค๋ฆฌ์œ„์— ํŠธ๋Ÿญ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด
            {
                q.add(truck_weights[idx]); // ํ์— ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ์˜ ๋ฌด๊ฒŒ๋ฅผ ์ถ”๊ฐ€
                current += truck_weights[idx++]; // ๋ฌด๊ฒŒ์— ํ•ด๋‹น ๋ฌด๊ฒŒ๋ฅผ ์ถ”๊ฐ€
            }
            else
                q.add(0); // ํŠธ๋Ÿญ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด 0 ์ถ”๊ฐ€
            
            answer++; // ์‹œ๊ฐ„ ์ฆ๊ฐ€
            
        } while(current != 0); // ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        
        
        return answer;
    }
}


์ฃผ์‹๊ฐ€๊ฒฉ - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

pricesreturn
[1, 2, 3, 2, 3][4, 3, 1, 1, 0]

์ฒซ ๋ฒˆ์งธ ๊ฐ€๊ฒฉ 1์€ 2, 3, 2, 3๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ๊ฐ€๊ฒฉ์ด ๋–จ์–ด์ง€์ง€ ์•Š์Œ - ์ด 4์ดˆ

๋‘ ๋ฒˆ์žฌ ๊ฐ€๊ฒฉ 2๋Š” 3, 2, 3 ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฏ€๋กœ - ์ด 3์ดˆ

์„ธ ๋ฒˆ์งธ ๊ฐ€๊ฒฉ 3์€ 3์ด๋ž‘ ๊ฐ™์œผ๋ฏ€๋กœ - ์ด 1์ดˆ

๋„ค ๋ฒˆ์งธ ๊ฐ€๊ฒฉ 2๋Š” 3๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ - ์ด 1์ดˆ

๋‹ค์„ฏ ๋ฒˆ์งธ ๊ฐ€๊ฒฉ 3์€ ๋น„๊ต ๋Œ€์ƒ์ด ์—†์œผ๋ฏ€๋กœ - ์ด 0์ดˆ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Queue<Integer> q = new LinkedList<>();
        
        for(int i : prices)
        {
            q.add(i);
        }
        int idx = 0;
        
        while(!q.isEmpty()) 
        {
            int currentPrice = q.poll(); // ์ฒซ๋ฒˆ์งธ ๊ฐ€๊ฒฉ์„ ๊บผ๋ƒ„
            for(int x : q) // ํ์— ๋‚จ์•„์žˆ๋Š” ๊ฐ€๊ฒฉ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธ
            {
                answer[idx]++; // ๋” ๋‚ฎ์€ ๊ฐ€๊ฒฉ์„ ์ฐพ๊ธฐ ์ „๊นŒ์ง€ ์ฆ๊ฐ€
                if(currentPrice > x) break;
            }
            idx++; // ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ
        }
        
        return answer;
    }
}
This post is licensed under CC BY 4.0 by the author.