설계
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();
});
문제
'알고리즘 > 문제풀이' 카테고리의 다른 글
[BOJ/1002] 터렛(C++) (0) | 2022.07.03 |
---|---|
[프로그래머스] 완주하지 못한 선수(C++) (0) | 2022.06.29 |
[BOJ/4889] 안정적인 문자열(C++) (0) | 2022.04.06 |
[백준] (C++) 19683번: 센티와 마법의 뿅망치 (0) | 2021.11.22 |