[Deque] 5430. AC - Gold5

GIGI·2022년 10월 27일

BOJ in Java

목록 보기
18/18
post-thumbnail

Deque (Double-Ended Queue)

  • 큐의 양쪽으로 엘리먼트의 삽입과 삭제를 수행할 수 있는 자료구조

Deque 인터페이스의 메소드

1. addFirst()

  • 덱의 앞에 엘리먼트 삽입. 정상적으로 삽입된 경우 true / 용량 제한시 false 리턴

2. addLast() (=add())

  • 덱의 뒤에 엘리먼트 삽입.

3. offerLast()

  • 덱의 마지막 쪽에 엘리먼트를 삽입.

4. removeFist() (=remove())

  • 덱의 앞에서 엘리먼트를 뽑아서 제거한 다음 해당 엘리먼트를 리턴.
    덱이 비어있을 시 예외 발생

5. pollFirst() (=poll())

  • 덱의 앞쪽에서 엘리먼트 하나를 뽑아서 제거한 다음 해당 엘리먼트 리턴.
    덱이 비어있을 시 null 리턴

6. pollLast()

  • 덱의 마지막에서 엘리먼트 하나를 뽑아서 제거한 다음 해당 엘리먼트 리턴
    덱이 비어있을 시 null 리턴

7. getFirst()

  • 덱의 앞쪽 엘리먼트를 제거하지 않고 리턴.
    비어있을 시 예외 발생

8. peekFirst() (=peek())

  • 덱의 앞쪽 엘리먼트를 제거하지 않고 리턴.
    비어있을 시 null

9. removeFirstOccurrence(Obejct o) / removeLastOccurrence(Object o)

  • 덱의 앞/뒤쪽에서 탐색하여 입력한 object o 와 동일한 첫 엘리먼트 제거.
    object o 와 같은 엘리먼트 없으면 덱의 변동 x

10. addAll(Collection < ? extends E c)

  • 입력 받은 Collection의 모든 데이터를 덱의 뒤쪽에 삽입

11. push()

  • = addFirst()

12. pop()

  • = removeFirst()

13. contain(Object o)

14. size()

15. iterator()

16. descendingIterator()

reference
링크텍스트

Code

import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
	static boolean isRight;
	static StringBuilder sb;

	public static void main(String[] args) throws NumberFormatException, IOException {
//		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		sb = new StringBuilder();
		for (int tc = 0; tc < T; tc++) {
			String p = sc.next();
			int n = sc.nextInt();
//			String string = bReader.readLine();
//			String subString = string.substring(1, string.length() - 1);
//			String[] s = subString.split(",");
//			ArrayDeque<Integer> deque = new ArrayDeque<>();
//			for (int i = 0; i < n; i++) {
//				deque.add(Integer.parseInt(s[i]));
//			} // 덱에 값 집어넣어줌
			StringTokenizer st = new StringTokenizer(sc.next(), "[],");

			ArrayDeque<Integer> deque = new ArrayDeque<Integer>();

			// 덱에 배열 원소를 넣어준다.
			for (int i = 0; i < n; i++) {
				deque.add(Integer.parseInt(st.nextToken()));
			}
			ac(p, deque);

		}
		System.out.println(sb.toString());

	}

	static void ac(String p, ArrayDeque<Integer> deque) {
		isRight = true;
		for (int i = 0; i < p.length(); i++) {
			if (p.charAt(i) == 'R') {
				isRight = !isRight;
				continue;
			}
			if (isRight) {
				if (deque.pollFirst() == null) {
					sb.append("error").append("\n");
					return;
				}
			} else {
				if (deque.pollLast() == null) {
					sb.append("error").append("\n");
					return;
				}
			}
		}
		print(deque);
	}

	static void print(ArrayDeque<Integer> deque) {
		sb.append("[");
		if (deque.size() > 0) {
			if (isRight) {
				sb.append(deque.pollFirst());
				while (!deque.isEmpty()) {
					sb.append(",").append(deque.pollFirst());
				}
			} else {
				sb.append(deque.pollLast());
				while (!deque.isEmpty()) {
					sb.append(",").append(deque.pollLast());
				}
			}
		}
		sb.append("]").append("\n");
	}
}

일단 정말 많이 틀렸다..
마지막에 통과가 된 이유는 StringBuilder를 쓴 것이 큰 것 같다.
그리고 다른 분의 코드를 참고하여 문자열 파싱을 해주었다.
새롭게 알게 된 사실!

StringTokenzier st = new StringTokenzier(sc.next(), "[], ");
profile
이제 누구도 날 막을 수 없다!!!!!!!!!!

0개의 댓글