17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
입력과 출력
- 입력
- 문자열 String
- 출력
- 단어만 뒤집기를 한 문자열 출력
문제 풀이 로직
- 헬퍼 변수 설명
- result : 결과를 출력하기 위해 <> 태그와 뒤집기를 한 단어를 모아둔 배열
- 형태 : [’<place>’, ‘54321’ , ‘<plcae>’ ]
- startN: <> 태그를 result 변수에 저장하기 위해 ‘<’의 위치 인덱스 값을 저장함
- String.slice(startN, i)로 쓰임
- isNoCount : 기본값 false
- ‘<’ 와 ‘>’가 아닌 word 중
- <> 태그 내의 word을 제외한 단어 word만을 저장하기 위한 boolean형 변수
- true : <>태그 내의 word → 저장 x
- false : 단어 word → countArr에 저장
- ‘<’ 를 만나면 true로, ‘>’를 만나면 false로 변경.
- countArr : 단어 word를 뒤집기 전에 저장하기 위한 배열
- 형태 : [ ’1’, ‘2’, ‘3’, ‘4’, ‘5’ ]
- 뒤집은 후 하나의 문자열로 변경하여 result에 최종 저장.
- result : 결과를 출력하기 위해 <> 태그와 뒤집기를 한 단어를 모아둔 배열
- word가 ‘<’ 일 때
- 태그의 시작이므로 현재 인덱스 i를 StartN에 저장함
- isNoCount를 true 상태로 바꿔서 false로 바뀌기 전까지는 다른 단어들 저장하지 않음
- 만약 이미 단어가 저장되고있는 상태(CountArr.length > 0인 상태)에서 ‘<’를 만난 것이라면
- CountArr에 들어있는 [ ’1’, ‘2’, ‘3’, ‘4’, ‘5’ ] 와 같은 형태의 요소들을 reverse하여 뒤집고 이를 result에 저장함
- word가 ‘>’일 때
- 태그의 끝이므로 StratN부터 현재 인덱스까지의 단어를 result에 저장함
- 앞으로 ‘<’와 ‘>’를 제외한 단어 word들은 모두 countArr에 저장해야하니
- isNoCount의 상태를 false로 변경함.
- isNoCount의 상태가 false일 때. 즉, !isNoCount == true 일 때 뒤집기를 위한 단어 word이므로 countArr에 저장
- 혹시나, <>태그를 만나지 않을 수도 있으니 (현재 ‘<’를 만날 때만 단어를 뒤집고 저장) 모든 word 확인 후 가장 마지막에 countArr에 있는 단어들을 뒤집고 저장함.
전체 코드
const fs = require('fs')
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt'
let String = fs.readFileSync(path).toString().trim()
let result = []
let startN = 0
let isNoCount = false
let countArr = []
String.split('').map((word, i) => {
if (word === '<') {
startN = i
isNoCount = true
if (countArr.length) {
result.push(
countArr
.join('')
.split(' ')
.map((a) => a.split('').reverse().join(''))
.join(' ')
)
countArr = []
}
} else if (word === '>') {
result.push(String.slice(startN, i + 1))
isNoCount = false
} else if (!isNoCount) countArr.push(v)
})
result.push(
countArr
.join('')
.split(' ')
.map((a) => a.split('').reverse().join(''))
.join(' ')
)
console.log(result.join(''))