[JAVA] 5430 - AC 💛5 : 문제에서 뒤집으라는데, 뒤집지 말라고?

2026. 3. 14. 13:44·Problem Solve

들어가며

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

문제는 직관적으로 이해가 가능하다. 배열 [1,2,3,4]가 주어졌을 때 명령 "R"이라면 배열뒤집기를([4,3,2,1]), 명령 "D"라면 앞에것을 지우면 된다.([2,3,4]) 근데 명령 입력의 수와 배열의 길이가 매우 커서 시간초과가 걱정되는 문제였다.

본문으로

처음에는 아래와 같이 정답을 제출했다. 문제에서 뒤집으란 말을 진짜로 뒤집기 위해 tempQ에 담아서 뒤집는 방식으로 구현했다....

public class Main {

    static int T, n;
    static String p, arr;

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(bf.readLine());

        StringBuilder sb = new StringBuilder();

        while (T-- > 0) {
            boolean isError = false;
            p = bf.readLine();
            n = Integer.parseInt(bf.readLine());
            arr = bf.readLine();
            ArrayDeque<Integer> deque = new ArrayDeque<>();
            for (int i = 1; i < arr.length() - 1; i += 2) {
                deque.addLast(Integer.parseInt(String.valueOf(arr.charAt(i))));
            }

            for (int i = 0; i < p.length(); i++) {
                char oper = p.charAt(i);
                if (oper == 'R') {
                    ArrayDeque<Integer> tempQ = new ArrayDeque<>();
                    while (!deque.isEmpty()) {
                        tempQ.addFirst(deque.pollFirst());
                    }
                    deque = tempQ;
                } else { // D
                    if (deque.isEmpty()) {
                        isError = true;
                        break;
                    }
                    deque.pollFirst();
                }
            }

            if (isError) {
                sb.append("error");
            } else {
                int size = deque.size();
                sb.append("[");
                for (int i = 0; i < size; i++) {
                    sb.append(deque.pollFirst());
                    if (i != size - 1) {
                        sb.append(",");
                    }
                }
                sb.append("]");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }

}

바로 시간초과 난다 ㅎㅎ. 애초에 R이 나올때마다 deque자료구조를 뒤집는 것은 O(N)인데, 배열과 명령의 최댓값은 각각 100,000으로 10만^10만 이니 무조건 시간초과가 난다.


이 문제의 핵심은 실제로 뒤집지 않는 것이 포인트였다! 뒤집었는지 안뒤집었는지 플래그 변수만 잘 관리해준다면, "D"명령이 들어왔을때도 아래처럼 처리하면 된다.

reverse == false → 앞에서 제거
reverse == true → 뒤에서 제거

그리고 출력도 reverse가 true인 상태라면 반대로 출력하면 되는것이다! 정답 코드는 아래와 같이 작성했다.

public class Main {

    static int T, n;
    static String p, arr;

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(bf.readLine());

        StringBuilder sb = new StringBuilder();

        while (T-- > 0) {
            boolean isError = false;
            boolean isReverse = false;
            p = bf.readLine();
            n = Integer.parseInt(bf.readLine());
            arr = bf.readLine();
            ArrayDeque<Integer> deque = new ArrayDeque<>();
            if (n > 0) {
                String[] nums = arr.substring(1, arr.length() - 1).split(",");
                for (String num : nums) {
                    deque.addLast(Integer.parseInt(num));
                }
            }
            for (int i = 0; i < p.length(); i++) {
                char oper = p.charAt(i);
                if (oper == 'R') {
                    isReverse = !isReverse;
                } else { // D
                    if (deque.isEmpty()) {
                        isError = true;
                        break;
                    }
                    if (isReverse) {
                        deque.pollLast();
                    } else {
                        deque.pollFirst();
                    }
                }
            }

            if (isError) {
                sb.append("error");
            } else {
                int size = deque.size();
                sb.append("[");

                if (isReverse) {
                    for (int i = 0; i < size; i++) {
                        sb.append(deque.pollLast());
                        if (i != size - 1) {
                            sb.append(",");
                        }
                    }
                } else {
                    for (int i = 0; i < size; i++) {
                        sb.append(deque.pollFirst());
                        if (i != size - 1) {
                            sb.append(",");
                        }
                    }
                }
                sb.append("]");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }

}

바로 통과한다!

마무리하며

이렇게 뒤집는 연산을 실제로 뒤집지 않고 간단하게 처리했다. 시간복잡도도 훨씬 줄어들었다.

 

뒤집으라고 해서 temp queue도 두고, 투포인터로 조금씩 줄여볼 생각도 해봤는데, flag변수로 뒤집었는지 여부만 확인하면 된다는 생각은 정말 혁신적이었다. 이렇게 뒤집는 문제들은 시간복잡도가 위험한 경우가 많던데 이 Thinking은 꼭 기억해서 나중에 써먹어야겠다~!

힘내자 🔥🔥

 

'Problem Solve' 카테고리의 다른 글

[JAVA] 2109 - 순회강연 💛3 : 최대를 만들기 위해서 최소를 버리자! Greedy한 사고  (1) 2026.03.17
[JAVA] 15926 - 현욱은 괄호왕이야!! 💛3 : 연속된 부분 문자열의 길이를 찾기 위해 스택에 값이 아닌 인덱스를 넣자.  (0) 2026.03.16
[JAVA] 13244 - Tree 💛4 : 트리 자료구조의 특징을 알고 있는지 물어보는 문제  (0) 2026.03.13
[JAVA] 14391 - 종이 조각 💛3 : 문제에서 주어지는 단어에 현혹되면 미궁으로 빠지는 문제. 본질을 위한 풀이를 작성하라!  (0) 2026.03.12
[JAVA] 11723 - 집합 🩶5 : 집합 여부를 Set 자료구조가 아닌 비트마스킹으로 풀어보기  (0) 2026.03.11
'Problem Solve' 카테고리의 다른 글
  • [JAVA] 2109 - 순회강연 💛3 : 최대를 만들기 위해서 최소를 버리자! Greedy한 사고
  • [JAVA] 15926 - 현욱은 괄호왕이야!! 💛3 : 연속된 부분 문자열의 길이를 찾기 위해 스택에 값이 아닌 인덱스를 넣자.
  • [JAVA] 13244 - Tree 💛4 : 트리 자료구조의 특징을 알고 있는지 물어보는 문제
  • [JAVA] 14391 - 종이 조각 💛3 : 문제에서 주어지는 단어에 현혹되면 미궁으로 빠지는 문제. 본질을 위한 풀이를 작성하라!
노을을
노을을
진인사대천명
  • 노을을
    노을의 개발일기장
    노을을
  • 전체
    오늘
    어제
    • All (105) N
      • Java & Kotlin (16)
      • Problem Solve (46)
      • Spring (4)
      • Infra (3) N
      • DB (2)
      • Project (2)
        • SOMA (1)
        • OJik (1)
      • OpenSource (3)
      • Various Dev (23)
        • 우아한테크코스 (9)
        • Git&Github (2)
        • Unity (12)
      • Book (3)
      • Writing (2)
  • 블로그 메뉴

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

    • github
  • 공지사항

  • 인기 글

  • 태그

    게임개발
    개발
    합격
    contribute
    트러블슈팅
    개발자
    github
    비트마스킹
    프리코스
    백준
    8기
    유니티
    코딩
    코테
    우아한테크코스
    java
    자바
    오픈소스
    알고리즘
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
노을을
[JAVA] 5430 - AC 💛5 : 문제에서 뒤집으라는데, 뒤집지 말라고?
상단으로

티스토리툴바