(Silver3) 백준 1213 펠린드롬(JavaScript, Node.js)

Adrian·2023년 2월 3일
0

PS

목록 보기
10/25
post-thumbnail

문제 링크

https://www.acmicpc.net/problem/1213

문제

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

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

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

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

입력

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

출력

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

예제 1 입력

AABB

예제 1 출력

ABBA

예제 2 입력

AAABB

예제 2 출력

ABABA

예제 3 입력

AABCBAA

예제 3 출력

ABACABA

예제 4 입력

ABCD

예제 4 출력

I'm Sorry Hansoo

풀이 과정

  • 회문(펠린드롬) 이란 반대로 뒤집어도 동일한 문자열을 의미한다. (ex 우영우, 토마토, ABBA ... )
  • 문자를 조합하여 회문을 만들때, 갯수가 홀수인 문자가 2개 이상이라면 절대로 회문을 만들 수 없다. 따라서 해당 케이스의 경우 예외처리를 해주어야한다.('I'm Sorry Hansoo' 출력)
  • 따라서 홀수인 문자가 2개 이상일 경우 예외처리를 하는 코드를 먼저 구현한다.
  • 그리고나서 알파벳의 총 갯수/2 만큼 반복을 돌려서 회문의 절반을 구현한다.
  • 홀수인 문자가 있을 경우 해당 문자 1개를 중앙에 넣어준다.
  • 그리고 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('');
};
profile
관조, 사유, 끈기

0개의 댓글