๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/23294)
< ์น ๋ธ๋ผ์ฐ์ 1 >
๋ฌธ์ ํ์ด
Deque 2๊ฐ๋ฅผ ์ฌ์ฉํด์ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ๊ณผ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ๋๋์ด ๊ตฌํํ๋ค.
๊ฐ ์์ ์ ์คํํ ๋๋ง๋ค ์บ์ ์ฉ๋๋ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ๊ณผ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ๋๋์ด ๊ณ์ฐํด ์ฃผ์๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;
import java.util.StringTokenizer;
public class _23294_ { // ์น ๋ธ๋ผ์ฐ์ 1
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int q = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int cap[] = new int[n + 1];
st = new StringTokenizer(bf.readLine());
for (int i = 1; i < n + 1; i++) {
cap[i] = Integer.parseInt(st.nextToken());
}
Deque<Integer> back = new ArrayDeque<>();
Deque<Integer> front = new ArrayDeque<>();
int now = -1;
int front_size = 0;
int back_size = 0;
for (int i = 0; i < q; i++) {
st = new StringTokenizer(bf.readLine());
char cmd = st.nextToken().charAt(0);
if (cmd == 'B') {
if (!back.isEmpty()) {
front.add(now);
front_size += cap[now];
back_size -= cap[back.peekLast()];
now = back.pollLast();
}
} else if (cmd == 'F') {
if (!front.isEmpty()) {
back.add(now);
back_size += cap[now];
front_size -= cap[front.peekLast()];
now = front.pollLast();
}
} else if (cmd == 'A') {
int num = Integer.parseInt(st.nextToken());
front_size = 0;
front.clear();
if (now != -1) {
back.add(now);
back_size += cap[now];
}
now = num;
while (front_size + back_size + cap[now] > c) {
back_size -= cap[back.pollFirst()];
}
} else if (cmd == 'C') {
Deque<Integer> temp = new ArrayDeque<>();
for (int x : back) {
if (temp.isEmpty()) {
temp.add(x);
} else {
if (temp.peekLast() != x) {
temp.add(x);
} else {
back_size -= cap[x];
}
}
}
back = temp;
}
}
bw.write(now + "\n");
if (back.isEmpty()) {
bw.write(-1+"\n");
} else {
Iterator<Integer> iter1 = back.descendingIterator();
while (iter1.hasNext()) {
bw.write(iter1.next() + " ");
}
bw.write("\n");
}
if (front.isEmpty()) {
bw.write(-1+"\n");
} else {
Iterator<Integer> iter2 = front.descendingIterator();
while (iter2.hasNext()) {
bw.write(iter2.next() + " ");
}
}
bw.flush();
}
}
Main
๋ณ์)
n : ์นํ์ด์ง์ ์ข ๋ฅ์ ์
q : ์์ ์ ๊ฐ์
c : ์ต๋ ์บ์ ์ฉ๋
cap : ๊ฐ ์นํ์ด์ง์ ์บ์ ๊ณต๊ฐ
back : Deque <Integer> ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ
front : Deque <Integer> ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ
now : ํ์ฌ ํ์ด์ง
front_size, back_size : ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์บ์ ์ฉ๋, ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์บ์ ์ฉ๋
cmd : ๊ฐ ์์
- ์น ํ์ด์ง์ ์ข ๋ฅ์ ์(n), ์ฌ์ฉ์๊ฐ ์ํํ๋ ์์ ์ ๊ฐ์(q), ์ต๋ ์บ์ ์ฉ๋(c) ์ ๋ ฅ
- ์น ํ์ด์ง์ ์ข ๋ฅ์ ์(n)๋งํผ ๊ฐ ์น ํ์ด์ง์ ์บ์ ๊ณต๊ฐ์ ์ ๋ ฅ๋ฐ์ cap ๋ฐฐ์ด์ ์ ์ฅ
- ์์ ์ ๊ฐ์(q)๋งํผ ์์ ์ ๋ ฅ๋ฐ์ ์ํ
: B๋ผ๋ฉด ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ด ๋น์ด์๋์ง ํ์ธ ํ ๋น์ด์์ง ์๋ค๋ฉด ํ์ฌ ํ์ด์ง๋ฅผ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์ ์ฅ ํ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์บ์ ์ฉ๋ ์ถ๊ฐ ๋ฐ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์์ ๊ฐ์ฅ ์ต๊ทผ์ ํ์ด์ง(pollLast)์ ์ ์
: F๋ผ๋ฉด ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ด ๋น์ด์๋์ง ํ์ธ ํ ๋น์ด์์ง ์๋ค๋ฉด ํ์ฌ ํ์ด์ง๋ฅผ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์ ์ฅ ํ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์บ์ ์ฉ๋ ์ถ๊ฐ ๋ฐ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์์ ๊ฐ์ฅ ์ต๊ทผ์ ํ์ด์ง(pollLast)์ ์ ์
: A๋ผ๋ฉด
1) ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์ ์ฅ๋ ํ์ด์ง๊ฐ ๋ชจ๋ ์ญ์ ๋๋ฏ๋ก clear ๋ฐ ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์บ์ ์ฉ๋ 0์ผ๋ก ์ ์ฅ
2) ์ฒ์์ผ๋ก ์น ํ์ด์ง์ ์ ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด(now!=-1) ํ์ฌ ํ์ด์ง๋ฅผ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์ถ๊ฐ
3) ์ฒ์์ผ๋ก ์ ์์ธ์ง ์๊ด์์ด ์น ํ์ด์ง ์ ์
4) ์ฌ์ฉ ์ค์ธ ์บ์ ์ฉ๋ (์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ + ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ + ํ์ฌ ์ ์ ์ค์ธ ํ์ด์ง)์ด ์ต๋ ์บ์ ์ฉ๋(c)์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์์ ๊ฐ์ฅ ์ค๋๋ ํ์ด์ง ์ญ์ (pollFirst)
: C๋ผ๋ฉด ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ ์ ์ฒด ํ์ํ๋ฉฐ ๊ฐ์ ๋ฒํธ์ ํ์ด์ง๊ฐ ์ฐ์ํด์ 2๊ฐ ์ด์ ๋ฑ์ฅํ ๊ฒฝ์ฐ ํ๋๋ง ๋จ๊ธฐ๊ณ ์ ๊ฑฐ
- ํ์ฌ ์ ์ ์ค์ธ ํ์ด์ง ๋ฒํธ ์ถ๋ ฅ
- ๋ค๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ด ๋น์ด์๋ค๋ฉด -1 ์ถ๋ ฅ, ๋น์ด์์ง ์๋ค๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐฉ๋ฌธํ ์์๋๋ก ์ถ๋ ฅํ๊ธฐ ์ํด ๋ค์์๋ถํฐ ํ์ํด์ ์ถ๋ ฅ
- ์์ผ๋ก ๊ฐ๊ธฐ ๊ณต๊ฐ์ด ๋น์ด์๋ค๋ฉด -1 ์ถ๋ ฅ, ๋น์ด์์ง ์๋ค๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐฉ๋ฌธํ ์์๋๋ก ์ถ๋ ฅํ๊ธฐ ์ํด ๋ค์์๋ถํฐ ํ์ํด์ ์ถ๋ ฅ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2812_ํฌ๊ฒ ๋ง๋ค๊ธฐ (0) | 2023.08.22 |
---|---|
[Baekjoon] 2841_์ธ๊ณ์ธ์ ๊ธฐํ ์ฐ์ฃผ (0) | 2023.08.22 |
[Baekjoon] 28279_๋ฑ 2 (0) | 2023.08.21 |
[Baekjoon] 2617_๊ตฌ์ฌ ์ฐพ๊ธฐ (0) | 2023.08.18 |
[Baekjoon] 17616_๋ฑ์ ์ฐพ๊ธฐ (0) | 2023.08.18 |