본문 바로가기

알고리즘/문제풀이

[BOJ/1213] 팰린드롬 만들기(JS)

설계 

1. 각 알파벳이 나온 횟수를 배열에 저장한다.

이때 A가 나온 횟수는 배열의 65번째 인덱스에 저장되고, B가 나온 횟수는 배열의 66번째 인덱스에 저장되는 원리인데, 

C++ 로 기존에 알고리즘 문제를 풀어왔을때는 arr['A'] = 2; 이런식으로 바로 대입이 가능했는데,, 

 

이번에 알고리즘 문제 풀이 언어를 자바스크립트로 바꾸면서 이런 DAT(Direct Address Table)을 어떻게 구현하는지 몰라서 

찾아본 결과 String 객체의 charCodeAt으로 문자 -> 아스키코드 변환, String.fromCharCode()로 아스키코드 -> 문자 복원이 가능하다는 것을 배웠다. 

 

2. 팰린드롬 문자열이 되기 위해서는 홀수번 나오는 문자가 하나여야하므로, 

홀수번 나오는 문자가 2개 이상인 경우 팰린드롬을 만들 수 없다.

(filter함수로 나온 횟수가 홀수인 알파벳이 들어있는 배열만든 뒤, 길이 > 1인지 검사)

 

3. 이후 배열을 돌면서 앞부분 문자열(front), 뒷부분 문자열(back), 길이가 홀수인 경우 중간에 들어갈 문자(middle)를 

만든 뒤, 이 세개를 더해 출력하면 된다. 

 

코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', function (input) {
    let dat = [];
    const len = input.length;
    for (let i = 0; i < len; i++) {
        const x = input.charCodeAt(i);
        dat[x] = dat[x] ? dat[x] + 1 : 1;
    }

    const oddItem = dat.filter((v) => v % 2 != 0);
    if (oddItem.length > 1) {
        console.log("I'm Sorry Hansoo");
        rl.close();
    }

    let front = '';
    let middle = '';
    let back = '';
    for (const key in dat) {
        let item = dat[key];
        let ch = String.fromCharCode(key);
        if (item % 2 === 1) {
            middle = ch;
            item--;
        }
        while (item > 0) {
            front += ch;
            back = ch + back;
            item -= 2;
        }
    }
    console.log(front + middle + back);
    rl.close();
}).on('close', function () {
    process.exit();
});

 

문제

 

1213번: 팰린드롬 만들기

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

www.acmicpc.net