
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

이번 문제는 정규표현식을 사용해서 해결하였다. 문제에서는 알파벳 소문자, 숫자, 공백(' '), 특수 문자('<', '>')로만 이루어져 있다고 조건을 주었다.
/<[a-z\s]+>|[a-z0-9]+/g는 태그 또는 태그 안에 단어를 의미한다.
<[a-z\s]+>는 <>안에 알파벳 소문자 또는 공백이 1개 이상 존재하거나
[a-z0-9]+는 괄호 없이 알파벳 소문자 또는 숫자가 1개 이상 존재함을 의미한다.
나는 두가지 방법으로 문제를 해결했었다.
처음에는 match()를 사용하여 일치하는 문자열을 배열 형태로 저장하였다. 그리고 하나씩 접근하여 태그가 아닌 경우에만 문자열을 가공하여 추가해주었다.
그리고 두번째 방법은 아래 코드와 같다. replace()를 사용하여 만들어준 패턴과 일치하는 부분을 찾아 태그이면 해당 문자열을 그대로 추가해주었고, 태그 안에 단어라면 문자열을 가공하여 다시 추가해주는 과정으로 해결하였다. 첫번째 방법보다는 두번째 방법이 좀 더 효율적이었다!
/**
* 백준 알고리즘 17413 단어 뒤집기 2
* 실버 3
* 문자열 정렬 파싱
* **/
const readline = require("readline");
const solution = (line) => {
let answer = line;
const regExp = /<[a-z\s]+>|[a-z0-9]+/g;
answer = answer.replace(regExp, (word) => {
return word.startsWith("<") ? word : word.split("").reverse().join("");
});
return answer;
};
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
console.log(solution(line));
});