백준 17413 단어 뒤집기2

bkboy·2022년 5월 12일
0

백준 초급

목록 보기
6/80
post-custom-banner

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 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에 문자를 거꾸로해서 정답에 넣고 열려있으면 그대로 넣고 공백을 추가한다.
// 마지막에 남은 문자를 뒤집어 넣어주면 끝

꽤나 복잡하다. 로직은 주석으로 정리해두었다.

profile
음악하는 개발자
post-custom-banner

0개의 댓글