[백준] #5430 AC

2024. 12. 6. 22:26·알고리즘

✏️ AC

사용 언어 : Java
레벨 : 골드 5
📎AC

 

🔎 문제 설명

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.

📌 입력과 출력 

입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.

각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.

다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)

다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)

전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.

 

출력 : 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

 

⚒️ 풀이

Deque를 사용하면 간단하게 풀 수 있는 것처럼 보이는 문제이지만 생각보다 처리해야하는 예외적인 부분이 많아서 시행착오를 좀 겪었다.

1. 배열 입력이 숫자만 들어오는 게 아니라 [1,2,3,4] 이런식으로 [] 와 , 가 포함된 문자열이라는 점, 심지어 출력도 이런 포맷으로 해야 함

2. 빈 배열이 들어와도 error로 처리하는 것이 아니라 빈 배열인 상태에서 빼기를 시도했을 때만 error가 출력되야 한다는 점

3. 명령어를 수행하는 도중엔 배열을 뒤집지 않아도 Deque를 통해 앞이나 뒤를 빼면 되는데, 문제는 마지막 명령어를 수행한 뒤에도 뒤집어져 있는 상태이면 출력할 때도 뒤집어서 출력이 되어야 한다는 점

 

이 3가지 문제점 때문에 꽤 많은 시간을 소요했던 것 같다. 흑흑

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int testCase = Integer.parseInt(br.readLine()); // TestCase 개수
        String[] function; // 명령어들을 하나씩 담을 배열
        int arrLength; // 배열의 길이 (인데 나는 사용하지 않았음)
        String str; // 배열이 문자열 형태로 들어오기 때문에 처리해줄 String 변수
        Deque<Integer> deque; // 각 테스트케이스마다 명령어를 수행할 Deque 
        boolean isFirst; // 뒤집었는지 체크
        boolean isError; // error 체크
        for(int i = 0; i < testCase; i++) {
            function = br.readLine().split(""); 
            arrLength = Integer.parseInt(br.readLine());
            
            // [] 를 제외한 문자열을 가져옴 
            str = br.readLine().replaceAll("[\\[|\\]]", "");
            deque = new ArrayDeque<>();
            isFirst = true;
            isError = false;
            
            // []를 없앴을 때 빈 문자열이 되지 않는 것만 split 처리
            if(!str.equals("")) {
                for (String s : str.split(",")) {
                    deque.add(Integer.parseInt(s));
                }
            }
            
            for (String s : function) {
                if (s.equals("R")) {
                    isFirst = !isFirst;
                } else if (deque.isEmpty()) {
                    // D인데 Deque가 비어있으면 error 체크하고 테스트케이스 바로 종료
                    isError = true;
                    break;
                } else {
                    // true 면 앞에서 빼고 false 이면 뒤에서 빼기
                    if(isFirst) {
                        deque.removeFirst();
                    } else {
                        deque.removeLast();
                    }
                }
            }

            // 에러 체크 및, 뒤집기 체크 후 출력 
            if(isError) {
                bw.write("error\n");
            } else {
                if(isFirst) {
                    bw.write(deque.toString().replaceAll(" ", "") + "\n");
                } else {
                    List<Integer> list = new ArrayList<>(deque);
                    Collections.reverse(list);
                    bw.write(list.toString().replaceAll(" ", "") + "\n");
                }
            }
        }

        bw.close();
    }
}

 

인텔리제이에서는 deque를 뒤집을 수 있는 메서드가 있기는 하던데 공식적으로 자바에서 지원하는 메서드는 아닌 것 같았다. (애초에 뒤집는게 가능하면 deque의 성질이 없어지는 느낌이기두 하고...) 그래서 그걸 좀 쉽게 처리하기 위해서 그냥 ArrayList를 사용해버렸고,, 뭔가 ArrayList를 쓰지 않고 풀어보고 싶어서 다른 방법도 시도해봤는데 코드가 너무 지저분해질 것 같아서 그냥 포기했다 ^0^!  

 

deque.reversed() 메서드 사용해서 제출하니까 컴파일 에러 두둥,,

 

 

처음에 문제를 봤을 땐 아 쉬운데? 했는데 풀어보니 아 .. 괜히 골드 문제가 아니네 싶었던 문제였다. 그래도 여러 시행착오 끝에 나오는 맞았습니다!! 는 아주 뿌듯하군용🥰

 

그리고 이건 tmi 인데 최대한 제가 생각한 테스트케이스들을 다 집어넣어보고 잘 동작해서 제출을 했는데 자꾸 틀렸습니다 가 나와서 대체.. 대체 오ㅐ?!?!???!?!!!! 라고 절규를 했는데 알고보니 뭐가 틀렸던 건 줄 아시나요 여러분?

ㅎㅎ error 오타남

 

 

'알고리즘' 카테고리의 다른 글

[백준/Java] #10986 나머지 합  (1) 2025.01.15
[백준/Java] #5427 불  (2) 2024.12.26
[백준] #13300 방 배정, #1919 애너그램 만들기  (3) 2024.12.06
[프로그래머스] 기초 문제 풀이 (조건에 맞게 수열 변하기 2, 1로 만들기, 문자열이 몇 번 등장하는지 세기)  (1) 2024.12.06
[백준/Java] #11659 구간 합 구하기 4, #11660 구간 합 구하기 5  (0) 2024.11.25
'알고리즘' 카테고리의 다른 글
  • [백준/Java] #10986 나머지 합
  • [백준/Java] #5427 불
  • [백준] #13300 방 배정, #1919 애너그램 만들기
  • [프로그래머스] 기초 문제 풀이 (조건에 맞게 수열 변하기 2, 1로 만들기, 문자열이 몇 번 등장하는지 세기)
하늘☁️
하늘☁️
개발일지, 학습, 스터디 기록 남기는 블로그 ☁️
  • 하늘☁️
    구름일지
    하늘☁️
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Java (3)
      • SQL (5)
      • 알고리즘 (31)
      • TIL (4)
      • CS (6)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    boj1377
    제로베이스백엔드스쿨초단기취업반
    백준
    java
    boj5427
    mysql
    cpu의작동원리
    제로베이스부트캠프
    스터디기록
    컴퓨터구조
    회고
    명령어파이프라인
    알고리즘
    충돌위험 찾기
    비순차적명령어처리기법
    db
    dna 비밀번호
    코딩테스트
    boj12891
    학습일지
    상속
    CS
    pccp 기출문제 3번
    TIL
    코딩테스트연습
    정적블록
    제로베이스백엔드스쿨
    boj10986
    프로그래머스
    코딩테스트입문
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하늘☁️
[백준] #5430 AC
상단으로

티스토리툴바