일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 우테코
- python
- 코딩테스트
- it 뉴스
- 싸피셜
- it 이슈
- 코딩테스트 연습
- 싸피
- 네트워크 관리사
- 코테
- SSAFY 7기
- SSAFY
- 신문 스크랩
- java 객체지향 프로그래밍
- 네트워크 관리사 2급
- 인앱결제
- 신문스크랩
- IT 동향
- SSAFYcial
- 프로그래머스
- IT 트렌드
- html
- Java
- 카카오
- KT
- 백준위
- 리얼클래스
- 구글
- 네트워크 관리사 2급 실기
- 백준
- Today
- Total
개발자일걸요..?
1406번 에디터 본문
링크 : https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
문제
한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.
이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.
이 편집기가 지원하는 명령어는 다음과 같다.
L | 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨) |
D | 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨) |
B | 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨) 삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임 |
P $ | $라는 문자를 커서 왼쪽에 추가함 |
초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.
입력
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.
출력
첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.
예제 입력 1
abcd
3
P x
L
P y
예제 출력 1
abcdyx
풀이 방법
step 1.입력받은 문자열을 모두 character 형태로 ArrayList에 넣어준다.
step 2. ArrayList의 가장 끝자리가 cursor라는 생각으로
step 2-1. cursor가 앞으로 이동하면 ArrayList의 끝자리부터 차례차례 stack에 보관
step 2-2. cursor가 뒤로 이동하면 ArrayList 끝자리에 stack의 가장 top부터 차례차례 추가
step 3. 글자를 삭제할 경우 ArrayList의 뒤에서 내용 삭제
명령어 | ArrayList | stack |
최초 | [a,b,c] | [] |
L | [a,b] | [c] |
L | [a] | [b,c] |
L | [] | [a,b,c] |
L | [] | [a,b,c] |
L | [] | [a,b,c] |
P x | [x] | [a,b,c] |
L | [] | [x,a,b,c] |
B | [x] | [a,b,c] |
P y | [y] | [x,a,b,c] |
최종 결과값 : ArrayList + stack => yxabc |
구현 코드
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));
String str = br.readLine();
ArrayList<Character> sentence = new ArrayList<Character>();
for(int i =0; i<str.length();i++) {
sentence.add(str.charAt(i));
}
Stack<Character> stack = new Stack<Character>();
int N = Integer.parseInt(br.readLine());
char[] order;
for(int n =0; n<N; n++) {
order = br.readLine().toCharArray();
switch(order[0]) {
case 'L':
if(!sentence.isEmpty()) {
stack.push(sentence.remove(sentence.size()-1));
}
break;
case 'D':
if(!stack.isEmpty()) {
sentence.add(stack.pop());
}
break;
case 'B':
if(!sentence.isEmpty()) {
sentence.remove(sentence.size()-1);
}
break;
case 'P':
sentence.add(order[2]);
break;
}
}
StringBuilder result = new StringBuilder();
for(int i =0; i<sentence.size(); i++) {
result.append(sentence.get(i));
}
while(!stack.isEmpty()) {
result.append(stack.pop());
}
bw.write(result.toString());
bw.flush();
br.close();
bw.close();
}
}
다른 풀이 : 두 개의 스택을 이용
백준 1406 에디터 Java
언뜻 봤을 땐 쉬워 보였던 문제이다. 하지만 한 번 틀리고 정답률을 보았을 때 쉽지 않은 문제라는 걸 알게되었다. 문제는 간단하다. 문자열이 주어지면 처음엔 커서가 문자열 맨 끝에 있고 L :
dundung.tistory.com
+) 참고 : 스택 개념
2022.02.16 - [프로그래밍 공부/자료구조와 알고리즘] - [자료구조] 스택(Stack)
[자료구조] 스택(Stack)
스택(Stack) - 정의 : Stack은 물건을 위로 쌓아올린 형태의 선형 자료 구조입니다. (선형 자료구조란, 자료 간의 관계가 1대1 관계를 갖는 자료구조를 의미합니다.) 물건을 쌓아 올린 형태의 자료 구
rookie-developer.tistory.com
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
1931번 회의실 배정 (0) | 2022.02.27 |
---|---|
2839번 설탕 배달 (0) | 2022.02.27 |
5568번 카드놓기 (0) | 2022.02.20 |
2563번 색종이 (0) | 2022.02.10 |
2605번 줄 세우기 (0) | 2022.02.10 |