๐ช๐ป 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]
์ฒซ ๋ฒ์งธ ์์ :
- ๋จ์ ์์
๋:
100 - 93 = 7
- ์๋ฃ ๋ ์ง:
7 / 1 = 7
์ผ - ํ ์ํ:
q = [7]
(์ฒซ ๋ฒ์งธ ์์ ์ ์๋ฃ ๋ ์ง)
- ๋จ์ ์์
๋:
๋ ๋ฒ์งธ ์์ :
- ๋จ์ ์์
๋:
100 - 30 = 70
- ์๋ฃ ๋ ์ง:
70 / 30 = 2.333...
โMath.ceil(2.333...) = 3
์ผ - ํ ์ํ: ํ์ฌ ํ์ ์ฒซ ๋ฒ์งธ ๊ฐ(
q.peek() = 7
)๊ณผ ๋น๊ต:7 > 3
์ด๋ฏ๋ก, ๋ ๋ฒ์งธ ์์ ์ ์ฒซ ๋ฒ์งธ ์์ ๊ณผ ํจ๊ป ๋ฐฐํฌ ๊ฐ๋ฅ.- ํ์
3
์ถ๊ฐ:q = [7, 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;
}
}
์ฃผ์๊ฐ๊ฒฉ - ํ๋ก๊ทธ๋๋จธ์ค
prices | return |
---|---|
[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;
}
}