leetcode

409. Longest Palindrome 자바스크립트

냠냠맨 2022. 12. 19. 23:14

⚡문제정보

 

생각나서 한번 재미로 풀어본 문제입니다.

이제... 프로그래머스에는 제가 풀 수 있는 문제가 없어서

리트코드로 공부한다음 프로그래머스 2레벨에 도전해보려구요

근데 이건 쉽게 풀 수 있음 당연함 easy임

 


 

🙄문제설명

영어 소문자,대문자로 구성된 문자열이 주어집니다.
그 문자열로 만들 수 있는 펠린드롬(앞뒤가똑같은문자)의 최대길이를 리턴하세요

 

 


 

 

🔍접근방법

 

회문이 되려면 짝수개의 같은 문자가 필요합니다.

하지만 회문의 정가운데 만큼은 1개의 문자도 존재할 수 있습니다.

 

따라서 map 자료구조를 이용해 각 문자의 등장횟수를 세어주고

map의 밸류값을 기반으로 짝수면 더해주고 홀수면 -1을 빼서 더해주면 될 것 같았습니다

만약 홀수면서 값이 1이라면 -1을 뺐을때 0이되니 아무일도 일어나지않고 그건 제가 원하는 일이니까요

 

그리고 배열에 홀수값이 존재한다면 그걸 체크해주고

마지막에 홀수값이 존재할땐 1을 더해주면 될 것 같습니다.

 


 

 

🔍나의 풀이

 

var longestPalindrome = function(s) {
    let map = new Map()
    let answer = 0
    let arr = 0
    for(i=0 ; i<s.length ; i++) {
        map.set(s[i] , map.get(s[i])+1 || 0 +1 )
    }
    
    [...map.values()].forEach(ele => {
        if(ele % 2 ==0) answer += ele
        else {
            answer += ele -1
            arr += 1
        }
    })
    if(arr != 0 ) answer += 1

    return answer
};

 

var longestPalindrome = function(s) {
    let map = new Map()
    let answer = 0
    let arr = 0
    //각각 map , 답 , 홀수요소가 있는지 세어줄 변수입니다.
    
    for(i=0 ; i<s.length ; i++) {
        map.set(s[i] , map.get(s[i])+1 || 0 +1 )
    }
    // map에 등장횟수를 담아줍니다.
    
    [...map.values()].forEach(ele => {
        if(ele % 2 ==0) answer += ele
        else {
            answer += ele -1
            arr += 1
        }
    })
    //map의 밸류만 뽑아내서 forEach를 돌려줍니다.
    //사실 그냥 forEach를 돌려도되긴할듯
    
    if(arr != 0 ) answer += 1
	//홀수 체크해주는 카운터가 0이 아니라면 1을 더해줍니다.
    
    return answer
    // 리턴
};

 


 

🔍다른사람의 좋은 풀이

 

var longestPalindrome = function(s) {
  let ans = 0;
  let keys = {};
  
  for (let char of s) {
    keys[char] = (keys[char] || 0) + 1;
    if (keys[char] % 2 == 0) ans += 2;
  }
  return s.length > ans ? ans + 1 : ans;
};

 

 

for 문을 한번만 사용하고도 문제를 해결하는 풀이입니다.

발상이 대단한것같아요

keys가 짝수가 될때마다 2를 더해주면 되는거네요

 

 

마지막 리턴에 삼항연산자는 무슨 원리인지 몰...르겠음

반응형