문제
https://www.acmicpc.net/problem/1406
풀이
1. Node.js(fs)
const fs = require('fs');
// 입력 파일을 읽고 문자열로 변환하여 줄 단위로 분리
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
let str = input[0]; // 초기 문자열
const commands = input.slice(2); // 명령어 목록
let leftStack = str.split(''); // 커서 왼쪽 스택
let rightStack = []; // 커서 오른쪽 스택
commands.forEach(command => {
switch (command[0]) {
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.length > 0) rightStack.push(leftStack.pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.length > 0) leftStack.push(rightStack.pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.length > 0) leftStack.pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.push(command[2]);
break;
}
});
// 최종 결과 출력
console.log(leftStack.join('') + rightStack.reverse().join(''));
2. Node.js(readLine)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
rl.on('line', (line) => {
input.push(line);
}).on('close', () => {
let str = input[0]; // 초기 문자열
const commands = input.slice(2); // 명령어 목록
let leftStack = str.split(''); // 커서 왼쪽 스택
let rightStack = []; // 커서 오른쪽 스택
commands.forEach(command => {
switch (command[0]) {
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.length > 0) rightStack.push(leftStack.pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.length > 0) leftStack.push(rightStack.pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.length > 0) leftStack.pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.push(command[2]);
break;
}
});
// 최종 결과 출력
console.log(leftStack.join('') + rightStack.reverse().join(''));
});
3. C#
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
string str = Console.ReadLine(); // 초기 문자열 입력
int M = int.Parse(Console.ReadLine()); // 명령어 개수 입력
var leftStack = new Stack<char>(str.Reverse()); // 커서 왼쪽 스택
var rightStack = new Stack<char>(); // 커서 오른쪽 스택
for (int i = 0; i < M; i++)
{
string command = Console.ReadLine();
switch (command[0])
{
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.Count > 0) rightStack.Push(leftStack.Pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.Count > 0) leftStack.Push(rightStack.Pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.Count > 0) leftStack.Pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.Push(command[2]);
break;
}
}
// 최종 결과 출력
Console.WriteLine(string.Concat(leftStack.Reverse()) + string.Concat(rightStack));
}
}
설명
- 스택을 활용한 커서 이동: 두 개의 스택을 사용하여 커서의 왼쪽과 오른쪽 부분을 관리한다. 커서 이동 명령어(L, D)는 두 스택 간의 데이터를 이동시키고, B는 왼쪽 스택의 데이터를 삭제하며, P는 왼쪽 스택에 데이터를 추가한다.
- 주요 로직 설명:
- leftStack과 rightStack은 각각 커서의 왼쪽과 오른쪽에 있는 문자들을 관리한다.
- L 명령어는 leftStack에서 rightStack으로 문자를 이동시켜 커서를 왼쪽으로 이동한다.
- D 명령어는 rightStack에서 leftStack으로 문자를 이동시켜 커서를 오른쪽으로 이동한다.
- B 명령어는 leftStack에서 문자를 삭제한다.
- P 명령어는 leftStack에 새로운 문자를 추가한다.
- 최종 출력:
- leftStack의 문자들을 순서대로 출력하고, rightStack의 문자들을 역순으로 출력하여 최종 문자열을 형성한다.
문제
https://www.acmicpc.net/problem/1406
풀이
1. Node.js(fs)
const fs = require('fs');
// 입력 파일을 읽고 문자열로 변환하여 줄 단위로 분리
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
let str = input[0]; // 초기 문자열
const commands = input.slice(2); // 명령어 목록
let leftStack = str.split(''); // 커서 왼쪽 스택
let rightStack = []; // 커서 오른쪽 스택
commands.forEach(command => {
switch (command[0]) {
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.length > 0) rightStack.push(leftStack.pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.length > 0) leftStack.push(rightStack.pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.length > 0) leftStack.pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.push(command[2]);
break;
}
});
// 최종 결과 출력
console.log(leftStack.join('') + rightStack.reverse().join(''));
2. Node.js(readLine)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
rl.on('line', (line) => {
input.push(line);
}).on('close', () => {
let str = input[0]; // 초기 문자열
const commands = input.slice(2); // 명령어 목록
let leftStack = str.split(''); // 커서 왼쪽 스택
let rightStack = []; // 커서 오른쪽 스택
commands.forEach(command => {
switch (command[0]) {
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.length > 0) rightStack.push(leftStack.pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.length > 0) leftStack.push(rightStack.pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.length > 0) leftStack.pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.push(command[2]);
break;
}
});
// 최종 결과 출력
console.log(leftStack.join('') + rightStack.reverse().join(''));
});
3. C#
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
string str = Console.ReadLine(); // 초기 문자열 입력
int M = int.Parse(Console.ReadLine()); // 명령어 개수 입력
var leftStack = new Stack<char>(str.Reverse()); // 커서 왼쪽 스택
var rightStack = new Stack<char>(); // 커서 오른쪽 스택
for (int i = 0; i < M; i++)
{
string command = Console.ReadLine();
switch (command[0])
{
case 'L': // 커서를 왼쪽으로 한 칸 이동
if (leftStack.Count > 0) rightStack.Push(leftStack.Pop());
break;
case 'D': // 커서를 오른쪽으로 한 칸 이동
if (rightStack.Count > 0) leftStack.Push(rightStack.Pop());
break;
case 'B': // 커서 왼쪽의 문자 삭제
if (leftStack.Count > 0) leftStack.Pop();
break;
case 'P': // 커서 왼쪽에 문자 추가
leftStack.Push(command[2]);
break;
}
}
// 최종 결과 출력
Console.WriteLine(string.Concat(leftStack.Reverse()) + string.Concat(rightStack));
}
}
설명
- 스택을 활용한 커서 이동: 두 개의 스택을 사용하여 커서의 왼쪽과 오른쪽 부분을 관리한다. 커서 이동 명령어(L, D)는 두 스택 간의 데이터를 이동시키고, B는 왼쪽 스택의 데이터를 삭제하며, P는 왼쪽 스택에 데이터를 추가한다.
- 주요 로직 설명:
- leftStack과 rightStack은 각각 커서의 왼쪽과 오른쪽에 있는 문자들을 관리한다.
- L 명령어는 leftStack에서 rightStack으로 문자를 이동시켜 커서를 왼쪽으로 이동한다.
- D 명령어는 rightStack에서 leftStack으로 문자를 이동시켜 커서를 오른쪽으로 이동한다.
- B 명령어는 leftStack에서 문자를 삭제한다.
- P 명령어는 leftStack에 새로운 문자를 추가한다.
- 최종 출력:
- leftStack의 문자들을 순서대로 출력하고, rightStack의 문자들을 역순으로 출력하여 최종 문자열을 형성한다.