[백준] 1213 팰린드롬 만들기 JavaScript

·2024년 6월 17일

문제

임한수와 임문빈은 서로 사랑하는 사이이다.

임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.

임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.

임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.

입력

첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.

출력

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

예제 입력

ABACABA

예제 출력

AABCBAA

내가 했던 풀이 방법

  1. name을 배열로 변환한 뒤, 사전순으로 정렬해준다.
  2. 팰린드롬으로 바꾼 이름을 저장할 배열을 만들어준다. 배열의 크기는 name의 length와 동일하게 해준다. (모든 요소를 " "으로 바꿔주었는데 이는 구현할 때 확인하기 편함일 뿐 구현하지 않아도 된다.)
  3. left 배열을 빈 배열로 선언해준다. 해당 배열은 알파벳이 홀수 개일 때, 남은 알파벳을 담는 배열이다. 알파벳이 3개, 5개, 11개... 어떤 갯수였던간에 상관없이 동일한 알파벳은 항상 1개만 들어오게 된다. (짝수개만큼은 처리가 된 후에 들어오기 때문)
  4. index를 0으로 두고 name을 순회한다.
  5. i가 마지막 index가 아니면서 name[i]와 name[i+1]이 동일한 경우 (sort를 해주었기 때문에 같은 알파벳끼리 뭉쳐있다.) 양 끝에 name[i]를 추가해주고, i와 index를 1 증가시켜준다. (이때 양끝은 index를 이용해 동일한 위치에 덮어쓰지 않도록 해준다.) 만약 i가 마지막 index이거나 다음 알파벳과 동일하지 않을 경우엔 left에 알파벳을 추가해준다. (i를 1 증가시켜주는 이유는 알파벳 2개를 처리해주었기 때문에 i를 2 증가시켜주어야 한다. for문으로 1이 자동으로 올라가고 있으니 1만 추가적으로 올려주면 된다.) (사전순으로 정렬한 뒤, 양끝부터 가운데로 모이도록 알파벳을 추가해주고 있다. 이렇게 구현함으로써 자연스럽게 만들어지는 이름은 항상 사전순으로 제일 먼저 오는 단어가 된다.)
  6. 모든 name을 순회했을 때 left에 남아있는 요소의 갯수가 1이 넘어갈 경우에는 팰린드롬을 만들 수가 없다. (예를 들어 현재 만들어진 name이 "AB BA"일 때, left에 "C D"가 있다고 하면, 어떻게 수정하더라도 팰린드롬이 만들어질 수가 없다.) 그러므로 1이 넘어갈 경우에는 "I'm Sorry Hansoo"를 출력해주고, 1일 경우에는 nameArr에 left[0]을 추가해주고, nameArr을 문자열로 출력해준다. 0일 경우에도 nameArr을 문자열로 출력해준다.

코드

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

name = name.split('');
name.sort();

let nameArr = Array.from({ length: name.length }, () => ' ');
let left = [];
let index = 0;
for (let i = 0; i < name.length; i++) {
  if (i !== name.length - 1 && name[i] === name[i + 1]) {
    nameArr[index] = name[i];
    nameArr[name.length - 1 - index] = name[i];
    i++;
    index++;
  } else {
    left.push(name[i]);
  }
}

if (left.length === 1) {
  nameArr[index] = left[0];
  console.log(nameArr.join(''));
} else if (left.length === 0) {
  console.log(nameArr.join(''));
} else {
  console.log("I'm Sorry Hansoo");
}

회고

팰린드롬 문제는 몇 번 풀어봐서 푸는 방법은 익숙했다. 지금까지 풀었던 팰린드롬 중에는 어려운 편이긴 했는데 일단 홀수 개의 단어가 몇개인지를 확인하고 풀이하는 기본적인 풀이 방법이 있지만, 이 방법이 나에게는 더 쉬운 것 같아서 이렇게 풀이했다. 실제로 정답 코드들 보면 비슷하게 풀이했는데 이렇게 푸니까 사전순 정렬도 바로되고 이해도 빨라서 좋았다.

profile
Frontend🍓

0개의 댓글