[알고리즘][X] AC

2024. 2. 6. 11:26알고리즘 풀이/Java

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

 

5430번: AC

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

www.acmicpc.net

package boj.solution5430;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {
	static StringBuilder sb = new StringBuilder();

//  더블리 링크드 구현 시도했으나 그럴 필요가 없음을 알게 됨
//	static class Node {
//		int number;
//		Node nextNode;
//		
//		
//		public Node(int number) {
//			this(number, null);
//		}
//
//
//		public Node(int number, Node nextNode) {
//			super();
//			this.number = number;
//			this.nextNode = nextNode;
//		}
//		
//	}
//	
//	static class LinkedList {
//		
//		Node head;
//		Node tail;
//		
//		public LinkedList() {
//			head = getNewNode(0);
//			tail = head;
//		}
//
//		public Node getNewNode(int number) {
//			return new Node(number);
//		}
//		
//		public void addLast(int number) {
//			Node newNode = getNewNode(number);
//			tail.nextNode = newNode;
//			tail = newNode;
//		}
//		
//		public void reverse() {
//			if (head.nextNode == null) {
//				return;
//			}
//			Node firstNode = head.nextNode;
//			Node lastNode = tail;
//			
//			head.nextNode = lastNode;
//			tail = firstNode;
//		}
//	}
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int T = Integer.parseInt(br.readLine());
		
		for (int testCase = 1; testCase <= T; testCase++) {
			char[] p = br.readLine().toCharArray();
			int n = Integer.parseInt(br.readLine());
			
			char[] inputArray = br.readLine().toCharArray();
			char[] filtered = Arrays.copyOfRange(inputArray, 1, inputArray.length - 1);
			st = new StringTokenizer(String.valueOf(filtered), ",");
			Deque<Integer> deque = new ArrayDeque<>();
			for (int i = 0; i < n; i++) {
					deque.addLast(Integer.parseInt(st.nextToken()));
			}
			
			
			boolean errorFlag = false;
			boolean reverseFlag = false;
			for (char c : p) {
				if (c == 'R') {
					reverseFlag = !reverseFlag;
				}
				if (c == 'D') {
					if (deque.isEmpty()) {
						errorFlag = true;
						break;
					}
					if (reverseFlag) {
						deque.removeLast();
					} else {
						deque.removeFirst();
					}
				}
			}
			
			if (errorFlag) {
				sb.append("error").append("\n");
			} else {
// reverse나 List로 바꾸기, 출력하기 등 O(n)이기 때문에 O(3n)이 되고 따라서 느리다고 생각했다.
//				List<Integer> result = new ArrayList<>();
//				while (!deque.isEmpty()) {
//					result.add(deque.removeFirst());
//				}
//				if (reverseFlag) {
//					Collections.reverse(result);
//				}
//				sb.append("[");
//				for (int i = 0; i < result.size(); i++) {
//					sb.append(result.get(i));
//					if (i != result.size() -1) {
//						sb.append(",");
//					}
//				}
//				sb.append("]\n");
				
				// O(n)이 한번씩만 걸리도록 하였지만 32ms 밖에 차이가 나지 않았다.
				sb.append("[");
				if (reverseFlag) {
					while (deque.size() > 1) {
						sb.append(deque.removeLast()).append(",");
					}
					if (!deque.isEmpty()) {
						sb.append(deque.removeLast());
					}
				} else {
					while (deque.size() > 1) {
						sb.append(deque.removeFirst()).append(",");
					}
					if (!deque.isEmpty()) {
						sb.append(deque.removeFirst());
					}
				}
				sb.append("]\n");
				
			}						
		}
		
		System.out.print(sb);
	}

}

나의 풀이

- 예외처리를 잘해줘야 했다.

- 난 ","이 마지막에 있다고 해서 sb.delete(sb.length-1)을 해줬는데 이러면 ","를 아예 안쓰는 경우 "["가 삭제되는 문제가 발생한다.

'알고리즘 풀이 > Java' 카테고리의 다른 글

[알고리즘] 배열 돌리기 1  (1) 2024.02.06
[알고리즘] 트리 정리  (0) 2024.02.06
[알고리즘] 요세푸스 문제  (0) 2024.02.05
[알고리즘] 한빈이와 Spot Mart  (0) 2024.02.05
[알고리즘] 수열 편집  (1) 2024.02.05