[201]17413翻単语2
19070 ワード
単語を逆さまにする
質問する
文字列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でリフレッシュします.
'<'
から始まると、'>'
に移動せず、スタックをresに再プッシュします.'<'
または' '
(空白)まで移動せず、スタックに積み上げられ、逆方向になり、resに押されます.Reference
この問題について([201]17413翻単语2), 我々は、より多くの情報をここで見つけました https://velog.io/@younoah/boj-17413テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol