greenhelix
greenhelix
greenhelix
07-20 22:38
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#18_Code Signal Arcade >> Palindrome Rearranging
Algorithm/Java

#18_Code Signal Arcade >> Palindrome Rearranging

2019. 11. 20. 12:00

Code Signal -Arcade

코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당. 

주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!


Palindrome Rearranging

회문을 재정리 해라. 

 

문제를 볼까요. 

주어진 문자열이 있습니다. 이 문자열의 각 문자들을 재 정리 했을때, 회문이 될 수 있는 지 확인해보라는 것입니다.

 

항상.. 말은 쉽죠..? 한번 풀어보겠습니다. 

 

입력값을 봤을때, 변화를 주면 회문이 될 수 있는지를 보고, 되면, true 안되면  false 를 반환하면 됩니다. 

 

예전에 회문에 대해 풀었던 기억이 있어서 참고를 해볼께요. 

       String string2 = 
         new StringBuilder(a).reverse().toString(); 
    
     if(a.equals(string2)){
        return true;
     }else{
        return false; 
     }

이런 식으로 했었군요..  그냥 reverse시켜서 회문이 되면 true 안되면 false...흠...

이걸로는 도움이 안되지만 일단 reverse를 기억해보면서 들어갔습니다... 뭔가 쓸만한게 있을꺼야.. 하면서 말이죠. 

 

하지만 택도 없었습니다. 

 

일단 답을 보여드릴께요. 

boolean palindromeRearranging(String inputString) {

    int [] check = new int [26]; 
    
    int t = 0; 

    for(int i =0 ; i< inputString.length(); i++){
        check[inputString.charAt(i) - 'a'] ++;    
    }
    
    int te = 0; 
    for(int i =0; i<check.length; i++){
        if(check[i] != 0) te ++; 
    }
    for(int i : check) 
        
        if(i % 2 == 1) t ++; 
        
    return inputString.length() % 2 == t; 
}

 

알파벳은 26자이니깐 일단 그 만큼의 배열을 선언해줍니다.  int [] check = new int [26] ; 

 

입력값의 알파벳의 순서에 따라 몇개씩 있는지 축적해주기 위해서입니다. 

 

그리고나서 반복문을 통해서 주어지 문자열을 알파벳 배열에 넣어줍니다. Check배열에는 각 알파벳 순서대로 

들어가게 되어있고, 만약 여러개가 있다면, 그것을 축적해서 숫자로만 몇개 들어있다.. 이런식으로 들어가게 됩니다. 

이 작업을 해줄 해당 코드 입니다. 

for(int i =0 ; i< inputString.length(); i++){
      
        check[inputString.charAt(i) - 'a'] ++; 
        
    }

 

이렇게 되고나서 Check 를 출력해보면... 

System.out.println("check = " + Arrays.toString(check));
//output 
//inputString: "aabb" 
//check = [2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

이해가 되시나요? 이런식으로 주어진 문자열을 구분해줍니다. 

 

그리고 나서 알파벳의 갯수가 짝수개씩 있는지 확인해줍니다. 

만약 짝수개라면 회문이 가능하다는 것이죠. 

 

그리고 홀수개의 알파벳이 있다면, 그 홀수의 알파벳의 종류가 몇가지인지 확인해줍니다. 

한가지 이상이라면 똑같은

 for(int i : check) 
       { if(i % 2 == 1) t ++; }

회문으로 생성이 불가해집니다. 

 

마지막으로는 그러한 회문 비율이 양쪽 대칭이 될 수 있는지 확인해주는 코드를 넣어서 true/false로 리턴하게 해줍니다.

 return inputString.length() % 2 == t; 

좀 어렵게 푼겁니다.. 답안 앨리트들은 훨씬 간단해요..

아무튼 클리어! 

 

앨리트들의 답안 코드를 볼께요. 

 

boolean palindromeRearranging(String inputString) {
    int map = 0;
    for(int i=0; i<inputString.length(); i++) {
        map ^= 1 << (inputString.charAt(i) - 'a');
    }
    return map == 0 || (map & -map) == map;
}

정말이지.. 간단합니다. 

map 이라는 변수를 선언해주고, 

반복문을 통해서, 주어진 문자열의 각 문자요소를 비트 연산을 통해서 구해냈습니다..

 

이해하려면 한참 걸리는 수듄이기 떄문에.. 패쓰... 암튼 심박하네요.. 

 

다음 앨리트..답안. 

boolean palindromeRearranging(String inputString) {

    int []niz = new int[26];
    
    for(int i=0; i<inputString.length(); i++)
        niz[inputString.charAt(i)-97]++;
    
    int cnt=0;
    for(int i=0; i<niz.length; i++)
        if(niz[i]%2!=0)
            cnt++;
    
    return cnt<=1;
}

ㅇ

오우 좀더 가뿐해 보이네요. 

이분은 저랑 비슷하게 하셨네요. 

알파벳 수만틈 배열을 선언해준뒤. 

아스키코드 97 은 'a'를 나타냅니다. 즉 그것을 CharAt(i)에 빼주어 해당 위치에 들어가게 해줍니다. 

 

그리고 나서 그 문자열의 갯수가 짝수가 아니라면, cnt ++를 해주고, (즉 홀수 인경우) 

 

Cnt가 1보다 작거나 같으면 true 아니라면 false를 반환하게 하여 가뿐하게 푸셨네요... 

아무튼 어려운 코드의 세상이였습니다. 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Java' 카테고리의 다른 글

#19_Code Signal Arcade >> Are Equally Strong  (0) 2019.11.21
#17_Code Signal Arcade >> Array Change  (0) 2019.11.19
#16_Code Signal Arcade >> Are Similar?  (0) 2019.11.18
    'Algorithm/Java' 카테고리의 다른 글
    • #20_Code Signal Arcade >> Array Maximal Adjacent Difference
    • #19_Code Signal Arcade >> Are Equally Strong
    • #17_Code Signal Arcade >> Array Change
    • #16_Code Signal Arcade >> Are Similar?
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바