[boj] 17413. 단어 뒤집기 2 (node.js)

호이·2022년 4월 26일
0

algorithm

목록 보기
59/77
post-thumbnail

문제 요약

[boj] 17413. 단어 뒤집기 2 (node.js)

  • 문제에 제시된 조건에 따라 주어진 문자열에서 태그와 단어들 구분하여 단어인 경우만 뒤집어서 출력하는 문제!

내 풀이

  • 문자열의 모든 문자를 확인한다. 이때, 태그의 시작이 발견되면 reverse 처리하지 않기 위해 while 문으로 태그의 끝까지를 그대로 result에 더한다. 태그가 아닌 문자인 경우는 temp에 저장한 후, 해당 문자의 끝까지 확인하여 뒤집어서 result에 더한다.

핵심 코드

while (true) {
  if (L >= R) break;
  if (str[L] == "<") {
    while (true) {
      result += str[L];
      if (str[L] == ">") break;
      L++;
    }
  } else if (str[L] == " ") {
    result += " ";
  } else {
    let temp = "";
    while (true) {
      if (str[L] == "<" || str[L] == " " || L >= R) break;
      temp += str[L];
      L++;
    }
    result += temp.split("").reverse().join("");
    continue;
  }
  L++;
}

더 나은 풀이

단어 뒤집기 2 - 다른 사람의 풀이

  • input.split(reg)map((word) => 해서, reg.test(word)? 만족하면 태그이므로 그대로 태그에 감싸진 문자열 반환 : 만족하지 않으면 태그가 아니므로 문자열을 뒤집에서 반환) 한다.

주절주절

  • 약 1시간 정도 풀었는데, 처음 30분은 split(" ")한 결과물을 가지고 정규식을 사용해 태그 문자열을 거르는 함수를 정의해 풀이했었다. 이 방법은 태그 내의 " "까지도 무조건 split 해버려서, 함수 적용 단위부터 잘못된 경우다. 고민하다 첫 번째 방법을 구현했는데, 예외 처리 때문에 30분 넘게 쓴 것 같다. 처음 처리방법인 정규식을 통해 split 할 수 있다는 걸 다른 풀이를 보고 배웠다. 문자열 처리의 최고봉은 역시 정규표현식을 마스터하는 게 열쇠일 듯!

전체 코드

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const solution = () => {
  const str = input();
  let result = "";
  let L = 0;
  let R = str.length;
  while (true) {
    if (L >= R) break;
    if (str[L] == "<") {
      while (true) {
        result += str[L];
        if (str[L] == ">") break;
        L++;
      }
    } else if (str[L] == " ") {
      result += " ";
    } else {
      let temp = "";
      while (true) {
        if (str[L] == "<" || str[L] == " " || L >= R) break;
        temp += str[L];
        L++;
      }
      result += temp.split("").reverse().join("");
      continue;
    }
    L++;
  }
  console.log(result);
};

let _line = 0;
const input = () => stdin[_line++];

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  solution();
  process.exit();
});
profile
매일 부활하는 개복치

0개의 댓글