[백준] 1251 단어 나누기 JavaScript

·2024년 5월 25일

문제

알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다.

먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다.

예를 들어,

단어 : arrested
세 단어로 나누기 : ar / rest / ed
각각 뒤집기 : ra / tser / de
합치기 : ratserde
단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 영어 소문자로 된 단어가 주어진다. 길이는 3 이상 50 이하이다.

출력

첫째 줄에 구하고자 하는 단어를 출력하면 된다.

예제 입력

mobitel

예제 출력

bometil

내가 했던 풀이 방법

firstLength : 첫 단어의 길이
secondLength : 두 번째 단어의 길이
last : 첫 단어를 제외한 단어
words : 만들어지는 단어 배열

  1. firstLength를 1로 초기화하고 반복문을 시작한다.
  2. firstLength가 word.length-1이 되면 반복문을 탈출한다. (word.length-1인 이유는 세 단어가 모두 1이상의 길이를 가지고 있다. 그러므로, firstLength의 최대 길이는 전체 길이에서 2를 뺀 만큼이다. 즉, word.length-1은 최소한 두 번째 단어이어야 한다.)
  3. word를 처음부터 firstLength까지 slice를 해준다. firstLength 이후의 단어를 last에 저장해주고, secondLength를 1로 초기화한 뒤, 두 번째 반복문을 시작한다. 두 번째 반복문이 끝나면 firstLength를 1 증가시키고 다시 반복한다.
  4. secondLength가 word.length-firstLength가 되면 반복문을 탈출한다. (전체에서 첫번째 길이만큼을 뺀값은 두 번째 단어와 세 번째 단어의 길이의 합이다. 각 단어는 1글자 이상을 가져야 하므로, word.lengnth-firstLength가 두 번째 단어의 길이가 되면 세 번째 단어는 글자를 가질 수가 없다.)
  5. last에서 secondLength만큼 slice를 해준다. 그 외의 단어는 모두 세 번째 단어가 된다.
  6. 각 단어를 배열로 변환하여 reverse를 해준 뒤, 문자열로 변환한 값을 합쳐 words에 push해준 뒤, secondLength를 1 증가시켜준다. (굳이 배열로 변환했다가 문자열로 다시 변환하는 이유는 reverse 메소드를 사용하기 위해서이다.)
  7. words를 사전순으로 정렬한 뒤, 가장 첫 번째 요소를 출력해준다.

코드

var fs = require('fs');
let word = fs.readFileSync(0, 'utf-8').toString().trim();

let firstLength = 1;
let last = '';
let words = [];
while (true) {
  if (firstLength === word.length - 1) break;
  let first = word.slice(0, firstLength);
  let secondLength = 1;
  last = word.slice(firstLength);
  while (true) {
    if (secondLength === word.length - firstLength) break;
    let second = last.slice(0, secondLength);
    let third = last.slice(secondLength);
    words.push(
      first.split('').reverse().join('') + second.split('').reverse().join('') + third.split('').reverse().join('')
    );
    secondLength++;
  }
  firstLength++;
}

words.sort();
console.log(words[0]);

회고

처음 문제를 보고 쉽겠다 생각했는데 막상 구현하려니.. 너무 복잡해지는 거 아닌가 싶었다. 하지만 결과적으로 세 단어밖에 없기 때문에 while문이 deep해지진 않겠구나 싶어서 일단 구현해봤는데 원트에 성공할 줄은 몰랐다.

profile
Frontend🍓

0개의 댓글