알고리즘 풀이

[JAVASCRIPT] 백준 1213번 문제 풀이

Lv1_junior_dev 2023. 4. 22. 14:01

❗ 풀이

const input = require('fs').readFileSync('dev/stdin').toString().trim().split('');

let countObject = {};
let fillArray = new Array(input.length).fill('');

input.forEach((element) => {
    countObject[element] == null ? (countObject[element] = 1) : countObject[element]++;
});

let isPossible = true;
let centerStr = '';

Object.keys(countObject).forEach((key) => {
    if (countObject[key] % 2 !== 0) {
        if (centerStr === '') {
            centerStr = key;
            countObject[key]--;
        } else {
            isPossible = false;
            return;
        }
    }
});
if (!isPossible) {
    console.log("I'm Sorry Hansoo");
} else {
    let i = 0;

    Object.keys(countObject).sort().forEach((key) => {
        const count = countObject[key];
        for (let j = 0; j < count / 2; j++) {
            fillArray[i] = key;
            fillArray[fillArray.length - i - 1] = key;
            i++;
        }
    });

    if (centerStr !== '') {
        const centerIdx = Math.floor(fillArray.length / 2);
        fillArray[centerIdx] = centerStr;
    }

    console.log(fillArray.join(''));
}
  1. 먼저 입력받은 문자열에서 각 문자의 등장 횟수를 세어주는 객체 countObject를 생성
  2. forEach를 사용하여 문자열의 각 문자를 하나씩 순회하고, 해당 문자가 countObject 객체에 존재하는지 여부를 확인
  3. 만약 해당 문자가 처음 발견된 것이라면 countObject 객체에 해당 문자를 key로 가지는 새로운 속성을 추가하고, 값은 1로 초기화
  4. 이미 해당 문자가 countObject 객체에 존재하는 것이라면 해당 문자의 등장 횟수를 증가
  5. 이 후 에는 countObject 객체를 순회하며, 문자열을 팰린드롬으로 만들기 위해 반복해야 하는 문자를 fillArray 배열에 추가
  6. Object.keys(countObject)를 사용하여 countObject 객체의 속성을 배열 형태로 추출한 뒤, forEach를 사용하여 배열의 각 요소를 순회
  7. 순회할 때는 해당 문자의 등장 횟수를 구하고, 문자열의 반을 구한 뒤 반만큼 해당 문자를 fillArray 배열에 추가
  8. for 문을 사용하여 해당 문자의 등장 횟수를 반으로 나눈 값을 기준으로 반복하여, 배열의 왼쪽과 오른쪽 끝부터 해당 문자를 채워 넣음.
  9. 이 과정을 거치면 fillArray 배열은 왼쪽에서부터 회문의 앞부분, 오른쪽에서부터 팰린드롬의 뒷부분이 채워짐
  10. 만약 문자열의 길이가 홀수인 경우, 중앙에 위치할 문자를 centerStr 변수에 저장해두고 fillArray 배열의 중앙 인덱스를 구한 뒤, 해당 위치에 centerStr 문자를 삽입
  11. isPossible 변수가 false라면 "I'm Sorry Hansoo"를 출력하고, 그렇지 않은 경우 fillArray 배열을 문자열로 변환하여 출력
  12. 조건에 따라 사전순으로 앞서는 팰린드롬을 출력해야 한다면, 출력 전에 fillArray 배열을 정렬해 주면 됨