https://www.acmicpc.net/problem/5397
코드설명
연결리스트 혹은 링크드리스트를 활용하여 해결할 수 있습니다.
문제에서 주어진대로 구현하면 되지만, 몇가지 신경써야할점입니다.
1. '<' 혹은 '>' 표시가 있을시 해당 방향으로 이동하기에 해당방향만 null 아닐시에만 이동되도록 처리합니다.
if(str.charAt(j) == '<') {
if(current.prev != null) {
current = current.prev;
}
}
else if(str.charAt(j) == '>') {
if(current.next != null) {
current = current.next;
}
}
2. 키보드로 입력한 키는 알파벳 대문자, 소문자, 숫자 일시에
맨앞의 경우, 바로 뒤가 비어있을수 있으니 null을 체크하여 진행합니다.
//맨앞일시
if(current.prev == null) {
newNode.prev = current;
newNode.next = current.next;
if(current.next != null) { //바로 다음 연결리스트가 null인지 확인해야합니다.
current.next.prev = newNode;
}
current.next = newNode;
current = newNode;
}
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int T, N, M;
public static Node root = new Node(' ', null, null);
public static Node current;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
T = Integer.parseInt(st.nextToken());
for(int i=0;i<T;i++) {
st = new StringTokenizer(br.readLine());
root = new Node(' ', null, null);
current = root;
String str = st.nextToken();
for(int j=0;j<str.length();j++) {
if(str.charAt(j) == '<') {
if(current.prev != null) { //해당방향만 확인합니다.
current = current.prev;
}
}
else if(str.charAt(j) == '>') { //해당방향만 확인합니다.
if(current.next != null) {
current = current.next;
}
}
else if(str.charAt(j) == '-') {
//맨앞일시
if(current.prev == null) {
continue;
}
//맨뒤일시
else if(current.next == null) {
current = current.prev;
current.next = null;
}
//중간일시
else {
current.prev.next = current.next;
current.next.prev = current.prev;
current = current.prev;
}
}
else {
Node newNode = new Node(str.charAt(j), null, null);
//맨앞일시
if(current.prev == null) {
newNode.prev = current;
newNode.next = current.next;
if(current.next != null) { //바로 다음 연결리스트가 null인지 확인해야합니다.
current.next.prev = newNode;
}
current.next = newNode;
current = newNode;
}
//맨뒤일시
else if(current.next == null) {
newNode.prev = current;
newNode.next = current.next;
current.next = newNode;
current = newNode;
}
//중간일시
else {
newNode.prev = current;
newNode.next = current.next;
current.next.prev = newNode;
current.next = newNode;
current = newNode;
}
}
}
StringBuilder sb = new StringBuilder();
Node temp = root.next;
while(temp != null) {
// System.out.print(temp.value);
sb.append(temp.value);
temp = temp.next;
}
System.out.println(sb);
}
}
}
class Node{
char value;
Node prev;
Node next;
public Node(char value, Node prev, Node next) {
this.value = value;
this.prev = prev;
this.next = next;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2075 N 번째 큰 수 - 정렬(Sort) + 우선순위큐(PriorityQueue) JAVA (0) | 2023.08.09 |
---|---|
[백준] 2304 창고 다각형 - 구현 + 그리디 JAVA (0) | 2023.08.08 |
[백준] 1406 에디터 - 연결리스트 + 링크드리스트 JAVA (0) | 2023.08.08 |
[백준] 11501 주식 - 탐욕법(Greedy, 그리디) + 우선순위큐(PriorityQueue)JAVA (0) | 2023.08.07 |
[백준] 1927 최소 힙 - 우선순위큐(PriorityQueue) JAVA (0) | 2023.08.07 |