문제
https://www.acmicpc.net/problem/1406
문제를 읽고 처음 했던 생각
- 문자열 수정(삽입/삭제)가 많이 일어나겠다 -> StringBuilder를 사용하자!!
- 문자열 크기는 600,000으로 크게 신경안써도 되겠다
- 자로구조는 크게 필요 없겠는데
- cursor 변수를 선언해 인덱스 위치를 저장해주면 되겠다
- 명령어는 switch case문으로 처리하자
결론
주어진 문자열을 StringBuilder를 사용해서 명렁어에 맞게 조작해 최종 문자열을 생성하면 되겠다❗️❗️
코드
package stack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _1406 {
public static void main(String[] args)throws IOException {
StringBuilder sb= new StringBuilder();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine());
String str=st.nextToken();//초기 문자열 입력받기
sb.append(str);//sb에 문자열 복사 완료.
// System.out.println(sb.toString());
int N=sb.length();//문자열의길이
int cursor=N;//문장의 맨뒤 = 마지막 문자의 오른쪽
//System.out.println(str.charAt(cursor-1));//이게 마지막 문자가르킴.
st=new StringTokenizer(br.readLine());
int M=Integer.parseInt(st.nextToken());
for(int i=0;i<M;i++){
st=new StringTokenizer(br.readLine());
String order=st.nextToken();
switch(order){
case "L":
if(cursor>0) cursor--;
else continue;
break;
case "D":
if(cursor<sb.length()) cursor++;//커서가 문장의 맨뒤가 아닌경우
else continue;
break;
case "B":
if(cursor<=0) continue;
else{ sb.deleteCharAt(cursor-1);//cursor왼쪽 원소 제거
cursor--;
}
break;
case "P":
String tmp=st.nextToken();//공백 기준 새 문자
sb.insert(cursor,tmp);
cursor++;
break;
}
}
System.out.println(sb.toString());
}
}
결과
한번에 맞춰버리기~
하지만 메모리나 시간이 다른 사람들과 비교해봤을 때 낭비가 너무 심하다는 걸 느꼈고, 다른 사람들 코드를 참고해봤더니 거의 대부분 linkedList나 Stack을 사용했더라..
삽입 삭제가 많다보니 linkedList는 인정..
이 문제를 보고 어떻게 Stack을 떠올리지??
'알고리즘' 카테고리의 다른 글
[알고리즘] 재귀 Recursion(Ft.백준_17478) (4) | 2024.08.30 |
---|---|
[알고리즘] 퀵정렬 - Quick Sort(Ft.백준_2750 ,2751) (1) | 2024.07.29 |
[코테] 백준_1920번 : 수 찾기 (0) | 2024.07.27 |
[알고리즘] 백준_10814(Java) (22) | 2024.04.08 |