[JS|구현 알고리즘] 백준 17413번. 단어 뒤집기 2

2024. 4. 13. 01:39·💾 자료구조 & 알고리즘/문제 풀이


 

 

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에 최종 저장.

 

  1. word가 ‘<’ 일 때
    • 태그의 시작이므로 현재 인덱스 i를 StartN에 저장함
    • isNoCount를 true 상태로 바꿔서 false로 바뀌기 전까지는 다른 단어들 저장하지 않음
    • 만약 이미 단어가 저장되고있는 상태(CountArr.length > 0인 상태)에서 ‘<’를 만난 것이라면 
    • CountArr에 들어있는 [ ’1’, ‘2’, ‘3’, ‘4’, ‘5’ ] 와 같은 형태의 요소들을 reverse하여 뒤집고 이를 result에 저장함
  2. word가 ‘>’일 때
    • 태그의 끝이므로 StratN부터 현재 인덱스까지의 단어를 result에 저장함
    • 앞으로 ‘<’와 ‘>’를 제외한 단어 word들은 모두 countArr에 저장해야하니
    • isNoCount의 상태를 false로 변경함.
  3. isNoCount의 상태가 false일 때. 즉, !isNoCount == true 일 때 뒤집기를 위한 단어 word이므로 countArr에 저장
  4. 혹시나, <>태그를 만나지 않을 수도 있으니 (현재 ‘<’를 만날 때만 단어를 뒤집고 저장) 모든 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(''))

'💾 자료구조 & 알고리즘/문제 풀이' 카테고리의 다른 글
  • [JS|구현 알고리즘] 백준 20055번. 컨베이어 벨트 위의 로봇
  • [JS|구현 알고리즘] 백준 2615번. 오목
  • [JS|구현 알고리즘] 백준 1244번. 스위치 켜고 끄기
  • [JS|구현 알고리즘] 백준 3474번. 교수가 된 현우
상심한 개발자
상심한 개발자
  • 상심한 개발자
    상심한 개발자
    상심한 개발자
  • 전체
    오늘
    어제
    • 상심한 개발자 (36)
      • 📝 공부 기록 (4)
        • Javascript (3)
        • CS (1)
        • NodeJS (0)
      • 💻 개발 기록 (1)
        • Sring, 스터디 모집 및 관리 기능 통합 서비.. (1)
      • 💾 자료구조 & 알고리즘 (26)
        • 이론 정리 (13)
        • 문제 풀이 (13)
      • 📝 후기 및 회고록 (4)
      • etc. (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    삽질기록
    배열
    JavaScript
    블로그
    array
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상심한 개발자
[JS|구현 알고리즘] 백준 17413번. 단어 뒤집기 2
상단으로

티스토리툴바