[백준/Java] 5430 - AC

2025. 9. 14. 18:14·코딩테스트/백준

https://www.acmicpc.net/problem/5430

문제


풀이

처음에는 그냥 Queue를 사용해서 풀려고 했다

그런데 뒤집힌 상태에서 원소를 빼야하는데 그렇게 하려면 모든 원소를 다 빼고 넣어야해서 굉장히 복잡했다

그래서 Deque를 사용하기로 했다

 

체크할 사항이 엄청 많은 문제였다

이 문제를 효율적으로 푸는 방법은 R이 나왔을 때 실제 원소들을 뒤집지 않고 변수를 선언하여 뒤집힌 상태를 저장하는 것이다

1. 기본 상태

  •  D 연산 -> 정상적으로 앞에서 원소를 빼면 된다. `deque.removeFirst()`
  • 최종 출력 -> `deque.removeFirst()`

2. 뒤집힌 상태

  • D 연산 -> 뒤집혔기 때문에 뒤에서 원소를 빼면 된다. `deque.removeLast()`
  • 최종 출력 -> `deque.removeLast()`

에러를 발생시키는 상황도 따로 저장해주어 StringBuilder로 한번에 출력했다

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		int T = Integer.parseInt(br.readLine());
		while (T-- > 0) {
			String p = br.readLine();
			int n = Integer.parseInt(br.readLine());
			String str = br.readLine();

			Deque<String> deque = new ArrayDeque<>();

			if (n > 0) {
				// 입력이 [ , , ] 형태이므로 괄호 제외 "," 로 구분해서 파싱
				String[] strArr = str.substring(1, str.length() - 1).split(",");
				for (String s : strArr) {
					// 큐에 넣어준다
					deque.add(s);
				}
			}

			boolean isError = false; // 에러 발생 상태
			boolean isReverse = false; // 뒤집힘 상태
			for (char cmd : p.toCharArray()) {
				if (cmd == 'R') {
					isReverse = !isReverse; // 방향 전환
				} else {
					// D 연산
					// 큐가 비어있으면 에러 상태
					if (deque.isEmpty()) {
						isError = true;
						break;
					}
					if (isReverse) {
						// 뒤집혀 있다면 큐 뒤에서 원소 제거
						deque.removeLast();
					} else {
						// 뒤집혀 있지 않다면 큐 앞에서 원소 제거
						deque.removeFirst();
					}
				}
			}

			// 에러 상태면 error 출력
			if (isError) {
				sb.append("error\n");
			} else {
				// 문제 요구사항 형태에 맞게 출력
				sb.append("[");
				if(!deque.isEmpty()) {
					if (isReverse) {
						// 뒤집혀 있다면 뒤에서 원소를 빼서 출력
						sb.append(deque.removeLast());
						while (!deque.isEmpty()) {
							sb.append(",").append(deque.removeLast());
						}
					} else {
						// 뒤집혀 있지 않다면 앞에서 원소를 빼서 출력
						sb.append(deque.removeFirst());
						while (!deque.isEmpty()) {
							sb.append(",").append(deque.removeFirst());
						}
					}
				}
				sb.append("]").append("\n");
			}

		}
		System.out.println(sb);

		br.close();
	}

}

결과

'코딩테스트/백준' 카테고리의 다른 글
  • [백준/Java] 10026 - 적록색약
  • [백준/Java] 7569 - 토마토
  • [백준/Java] 1074 - Z
  • [백준/Java] 14940 - 쉬운 최단거리
KDH.dev
KDH.dev
  • KDH.dev
    CodingHard
    KDH.dev
  • 전체
    오늘
    어제
    • 전체글 (81)
      • 코딩테스트 (74)
        • 프로그래머스 (13)
        • 백준 (61)
      • CS (3)
        • 네트워크 (3)
      • Spring (1)
      • Java (3)
        • 자료구조 (3)
        • 알고리즘 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    [LG유플러스] 유레카 백엔드 개발자
    멀티캠퍼스it부트캠프
    30804
    네트워크
    CS
    부트캠프후기
    17626
    11660
    자바
    16935
    프로그래머스 Lv.0
    18111
    코딩테스트
    13913
    프로그래머스
    21736
    백준
    5525
    자료구조
    14940
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
KDH.dev
[백준/Java] 5430 - AC
상단으로

티스토리툴바