(boj) 17413. 역말 2

(boj) 17413. 역말 2

문자열 S가 주어지면 해당 문자열의 단어만 뒤집기를 원합니다.

첫째, 문자열 S는 다음 규칙을 따릅니다.

  1. 알파벳 소문자(‘a’-‘z’), 숫자(‘0’-‘9’), 공백(‘ ‘), 특수문자(‘<', '>‘).
  2. 문자열의 시작과 끝은 공백이 아닙니다.

  3. 만약에 ‘<' und '>‘가 문자열에 있으면 번갈아 나타나며 ‘<'가 먼저 나타납니다.

    두 문자의 수도 동일합니다.

태그는 “로 시작하는 길이가 3 이상인 하위 문자열입니다.

<“ beginnt und mit „>‘ 사이에 ‘로 끝남<“ und „>‘는 소문자와 공백만 포함합니다.

단어는 소문자와 숫자의 하위 문자열이며 연속된 두 단어는 공백으로 구분됩니다.

태그는 단어가 아니며 태그와 단어 사이에 공백이 없습니다.


1. 문제 분석

주어진 문자열에 대해 태그 안에 있는 단어는 변경되지 않고 태그 외부에 있는 단어는 반전되어 표시됩니다.


역순으로 출력 => LIFO (후입 선출법) 스택 데이터 구조를 사용할 수 있습니다.


단어 끝, ‘<' 및 문장 끝의 공백에 주의하십시오.따라서 스택의 문자는 역순으로 인쇄됩니다.


두 번째 솔루션

const fs = require('fs')
const testString = fs.readFileSync(process.platform ===
                                   'linux' ? '/dev/stdin' : 'input.txt')
                     .toString().trim()
const sArr = (...testString)
const stack = ()
// 현재 문자가 Tag 내부의 문자인지 표현하는 Flag
let isTag = false
let answer=""
for (let i = 0; i < sArr.length; i++) {
    const char = sArr(i)
    // Tag의 시작
    if (char === '<') {
        isTag = true
        // Tag 시작 시 Stack 내의 문자열 출력
        while(stack.length !
== 0) { answer += stack.pop() } answer += char // Tag의 종료 } else if (char === '>') { isTag = false answer += char } else { // 현재 Tag 내부 이면 일반 출력 if (isTag) { answer += char } else { // 공백을 만나면 단어의 끝이므로 Stack 내부에 있는 문자열 출력 if (char === ' ') { while (stack.length !
== 0) { answer += stack.pop() } answer += char } else { // Tag 바깥이므로 역순 출력 위해 Stack에 저장 stack.push(char) } } } } // 테스트 케이스 풀이 제출 이전 Stack 내 남아있는 문자열 출력 while(stack.length !
== 0) { answer += stack.pop() } console.log(answer)


마지막으로

문자열 반전에 문제가 있는 경우 대부분 스택 데이터 유형을 사용하는 데 문제가 있음을 기억해야 합니다.