https://www.acmicpc.net/problem/1213
임한수와 임문빈은 서로 사랑하는 사이이다.
임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.
임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.
임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
예제 1 입력
AABB
예제 1 출력
ABBA
예제 2 입력
AAABB
예제 2 출력
ABABA
예제 3 입력
AABCBAA
예제 3 출력
ABACABA
예제 4 입력
ABCD
예제 4 출력
I'm Sorry Hansoo
회문(펠린드롬)
이란 반대로 뒤집어도 동일한 문자열을 의미한다. (ex 우영우, 토마토, ABBA ... )'I'm Sorry Hansoo' 출력
)알파벳의 총 갯수/2
만큼 반복을 돌려서 회문의 절반을 구현한다.reverse
메서드로 절반을 반대로 뒤집어서 기존 회문과 붙여준다. const fs = require('fs');
const root = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(root, 'utf8').toString().trim();
console.log(solution(input));
function solution(input) {
// 알파벳을 키, 갯수를 값으로 갖는 객체생성
const target = input.split('').reduce((acc, cur)=> {
acc[cur] = acc[cur] ? acc[cur] + 1 : 1;
return acc;
}, {});
// 해당 객체에서 값만 뽑아서 홀수가 2개 이상이면 예외처리
const oddCount = Object.values(target).filter(a=> a % 2 === 1).length;
if(oddCount > 1) return 'I\'m Sorry Hansoo';
// 객체에서 [키,값]을 원소로 받는 data배열을 생성하고 해당배열을 오름차순 정렬
let data = Object.entries(target).sort((a,b)=>a[0].localeCompare(b[0]));
// 회문의 절반과 홀수인 문자를 저장할 변수 생성
let halfAnswer = '';
let oddChar = '';
//data 배열의 [키,값] 쌍을 차례로 순회하며
data.forEach(([alphabet, count])=>{
let temp = '';
//갯수가 홀수인 문자가 존재할시 해당 문자를 홀수인 문자를 oddChar 변수에 담고,
if(count % 2 === 1) {
oddChar = alphabet;
}
//모든 문자의 총 갯수의 절반만큼 반복을 돌려 해당 회문의 절반을 완성한다.
if(count > 1 ){
for(let i = 0; Math.floor(count/2) > i; i++){
temp += alphabet;
}
halfAnswer += temp;
}
}
)
// 회문 + 갯수가 홀수인 문자(없을경우 '') + 뒤집은 회문을 반환
return halfAnswer + oddChar + halfAnswer.split('').reverse().join('');
};