on
단어뒤집기 2 (17413번) [node.js, JavaScript]
단어뒤집기 2 (17413번) [node.js, JavaScript]
단어뒤집기 2 (17413번) [node.js, JavaScript]
문제 설명
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다. 문자열의 시작과 끝은 공백이 아니다. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
의사코드
뒤집어야 하는 위치를 체크할 수 있도록 문자열 길이만큼 info 배열을 생성하고 0으로 초기화해줍니다. 반복문에서 뒤집어야 하는 위치에 1을 넣어주면서 info 배열을 완성시킵니다. info배열을 순회하면서 첫번째 1의 인덱스를 start 인덱스로 저장합니다. 1이 끝나고 0이된 시점의 인덱스를 end인덱스로 저장합니다. slice메서드로 뒤집을 문자열을 추출한 뒤 각 문자를 배열로 만들고 뒤집고, 다시 문자열로 합쳐줍니다. 문자열의 끝이 특수문자가 아닌 경우(즉 info의 마지막요소가 1일 때) 끝 단어가 추가되지 않기 때문에 반복문이 종료된 후 문자열의 start인덱스부터 끝까지를 복사해서 뒤집어 붙여주면 answer를 구할 수 있습니다.
Code
const input = require("fs").readFileSync("/dev/stdin").toString().split("
"); solution(input); function solution(input) { const string = input[0]; const len = string.length; let answer = ''; const info = new Array(len).fill(0); let canReverse = true, firstFind = false; for (let i = 0; i < len; i++) { if (string[i] === "<") { canReverse = false; } else if (string[i] === ">") { canReverse = true; } else { if (canReverse && string[i] !== " ") { info[i] = 1; } } } const infoLen = info.length; for (let i = 0; i < infoLen;) { if (info[i] === 1) { if (!firstFind) { firstFind = true; start = i; } i++; } else { if (firstFind) { end = i; answer += string.slice(start, end).split('').reverse().join(""); firstFind = false; } answer += string[i]; i++; } } //info의 마지막 요소가 1로 끝나는 경우 예외처리 if (firstFind) { end = infoLen; answer +=string.slice(start, end).split('').reverse().join(""); firstFind = false; } console.log(answer); }
from http://jinblog123.tistory.com/136 by ccl(A) rewrite - 2021-10-17 00:01:36