[201]17413翻単语2



単語を逆さまにする


質問する


文字列Sが与えられると、その文字列の中で単語だけを反転させたい.
まず、文字列Sは、以下のルールを遵守する.
  • 文字の小文字(「a」-「z」)、数字(「0」-「9」)、空白(「 」)、特殊文字(「<」、「>」)からなる.
  • 文字列の先頭と末尾はスペースではありません.
  • <」と「>」は文字列の中で交互に現れ、「<」はまず現れる.また、2文字の個数は同じです.
  • ラベルは「<」で始まり、「>」で終わる長さが3より大きい部分の文字列で、「<」と「>」の間にはアルファベットの小文字とスペースしかありません.単語は小文字と数字からなる部分文字列で、連続する2つの単語は1つのスペースで区切られています.ラベルは単語ではなく、ラベルと単語の間にスペースがありません.

    入力


    最初の行は文字列Sを与える.Sの長さは100000以下である.

    しゅつりょく


    1行目に文字列Sの単語を逆さに出力します.

    コピー例入力1

    baekjoon online judge

    コピー例出力1

    noojkeab enilno egduj

    コピー例入力2

    <open>tag<close>

    コピーサンプル出力2

    <open>gat<close>

    コピー例入力3

    <ab cd>ef gh<ij kl>

    コピー例出力3

    <ab cd>fe hg<ij kl>

    コピー例入力4

    one1 two2 three3 4fourr 5five 6six

    コピーサンプル出力4

    1eno 2owt 3eerht rruof4 evif5 xis6

    コピー例入力5

    <int><max>2147483647<long long><max>9223372036854775807

    コピーサンプル出力5

    <int><max>7463847412<long long><max>7085774586302733229

    コピー例入力6

    <problem>17413<is hardest>problem ever<end>

    コピーサンプル出力6

    <problem>31471<is hardest>melborp reve<end>

    コピー例入力7

    <   space   >space space space<    spa   c e>

    コピーサンプル出力7

    <   space   >ecaps ecaps ecaps<    spa   c e>

    コード#コード#

    //---- 세팅 ----//
    const fs = require('fs');
    const stdin = (
      process.platform === 'linux'
        ? fs.readFileSync('/dev/stdin').toString()
        : `\
    baekjoon online judge
    `
    ).split('\n');
    
    const input = (() => {
      let line = 0;
      return () => stdin[line++];
    })();
    
    //---- 풀이 -----//
    
    const str = input();
    const strArr = str.split('');
    const res = [];
    
    const isNum = c => {
      if (c.trim() === '') return false;
      return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].includes(Number(c));
    };
    
    const isAlphabet = c => {
      const code = c.charCodeAt();
      if (65 <= code && code <= 90) return true;
      if (97 <= code && code <= 122) return true;
      return false;
    };
    
    while (strArr.length > 0) {
      const stack = [];
    
      if (strArr[0] === '<') {
        while (strArr[0] !== '>') {
          stack.push(strArr.shift());
        }
        stack.push(strArr.shift());
        res.push(...stack);
      } else if (isNum(strArr[0]) || isAlphabet(strArr[0])) {
        while (strArr.length > 0 && strArr[0] !== '<' && strArr[0] !== ' ') {
          stack.push(strArr.shift());
        }
        stack.reverse();
        res.push(...stack);
      } else {
        res.push(strArr.shift());
      }
    }
    
    console.log(res.join(''));
    

    に答える


    以前は単語1問をひっくり返す場合は空白を基準にしていたので、ひっくり返すだけで済みました.
    しかし今回の問題は複雑なのでスタックを使いました.
    まず、入力したすべての文字を1つの文字に分割し、配列に配置します.
    次に、次の3つの場合に、スタックに文字を積み重ね、resでリフレッシュします.
  • 2'<'から始まると、'>'に移動せず、スタックをresに再プッシュします.
  • 文字または数字で開始すると、'<'または' '(空白)まで移動せず、スタックに積み上げられ、逆方向になり、resに押されます.
  • ビット目は、キャビネットを除いて(空白のように)、変位せずにresに直接押します.