문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
- 문자열의 시작과 끝은 공백이 아니다.
- '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
const input = require('fs').readFileSync('/dev/stdin').toString().trim();
const sol = (input) => {
let temp = "";
let isTag = false;
let answer = "";
for (let s of input) {
if (s === "<") {
isTag = true;
answer += temp.split("").reverse().join("") + s;
temp = "";
} else if (s === ">") {
isTag = false;
answer += temp + s;
temp = "";
} else if (s === " ") {
answer += !isTag ? temp.split("").reverse().join("") : temp;
answer += " ";
temp = "";
} else {
temp += s;
}
}
answer += temp.split("").reverse().join("");
return answer;
};
console.log(sol(input));
// temp에 계속 누적하다가 < 를 만나면 현재까지 누적된 문자를 거꾸로해서 정답에 넣고 < 까지 넣는다.
// > 를 만나면 temp에 넣었던 거 그대로 정답에 넣고 > 까지 넣는다.
// 공백을 만나면 tag가 닫혀있으면 temp에 문자를 거꾸로해서 정답에 넣고 열려있으면 그대로 넣고 공백을 추가한다.
// 마지막에 남은 문자를 뒤집어 넣어주면 끝
꽤나 복잡하다. 로직은 주석으로 정리해두었다.