[백준] 5430번: AC

ByWindow·2022년 1월 20일
0

Algorithm

목록 보기
72/104
post-thumbnail

📝 문제

문제를 풀 때 간과해서는 안되는 것이 시간제한과 연산횟수이다.
이 문제의 주어진 조건을 살펴보면

  • 최대 100개의 테스트케이스
  • 최대 100000개의 수행 함수 : R이 100000개라면 배열 reverse 연산을 100000번 해야된다
  • 배열의 최대 길이 100000

아무 생각없이 R이 나올 때마다 reverse 동작을 수행한다면 시간초과가 난다.
그래서 우리는 R이 나올 때 실제로 배열을 역순으로 바꾸는 것이 아니라 역순처럼 보이도록 해야한다.
즉, 배열의 시작점만 바꾸는 것이다.
이것만 인지하고 푼다면 문제는 맞출 수 있다.
하지만 수행시간에서 좋은 평가를 받지 못 한다. 내가 그랬다ㅜㅜ

개선할 부분

  1. array
    • 나는 reverse를 for문으로 구현하는게 귀찮아서 숫자 배열을 list로 만들고 Collections.reverse 함수를 수행했다. 하지만 list에 숫자를 삽입하고 제거하는 동작보다 배열에 숫자를 삽입하고 인덱스 포인터를 수정하는 동작이 소요시간이 더 적다.
  2. parse
    • 나는 StringTokenizer에 delimeter로 ','를 부여해서 String 타입의 배열을 만들었지만, 더 좋은 코드들을 보면 readLine으로 읽어온 String의 각 char를 '0'으로 빼서 숫자로 만들 수 있는지 판단한다.
      예시)
    if (c >= '0' && c <= '9') {
    	number = number*10 + (c-'0');
    }

📌 코드

package Baekjoon;

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

public class BOJ5430 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    StringTokenizer st;
    int t = Integer.parseInt(br.readLine());
    for(int i = 0; i < t; i++){
      String p = br.readLine();
      int len = p.length();
      int n = Integer.parseInt(br.readLine());
      boolean isError = false;
      List<String> list = new ArrayList<>();
      String arr = br.readLine();
      st = new StringTokenizer(arr.substring(1, arr.length()-1), ",");
      for(int j = 0; j < n; j++){
        list.add(st.nextToken());
      }
      int point = 0;
      for(int j = 0; j < len; j++){
        char cur = p.charAt(j);
        // 배열을 뒤집기 - 뒤집는 것과 같은 효과
        if(cur == 'R'){
          point = point == 0 ? list.size()-1 : 0;
        }
        // 배열 앞의 수 버리기
        else{
          // 배열 길이가 0일 경우 예외처리
          if(list.size() == 0){
            isError = true;
            break;
          }
          list.remove(point);
          point = Math.max(point-1, 0); // 0 이하로 갈 수 있다
        }
      }
      if(point == list.size()-1) Collections.reverse(list);
      String answer = String.join(",", list);
      bw.write(isError ? "error" + "\n" : "[" + answer + "]\n");
    }
    bw.flush();
    bw.close();
  }
}
profile
step by step...my devlog

0개의 댓글