๐ช๐ป 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;
}
}