greenhelix
greenhelix
greenhelix
07-12 22:56
  • 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

#45_Code Signal Arcade >> Build Palindrome
Algorithm/Java

#45_Code Signal Arcade >> Build Palindrome

2020. 4. 8. 23:00

Code Signal -Arcade

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

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

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


Build Palindrome 

회문을 만들어라

 

주어진 문자열을 회문으로 바꿔주라는 문제입니다. 

단, 최대한 짧게 회문을 구성하라고 하네요. 

 

코드를 보겠습니다. 

String buildPalindrome(String st) {    
    StringBuilder stst = new StringBuilder(st).reverse(); 
    System.out.println("stst is .." + stst); // cdcba
    StringBuilder newSt = new StringBuilder(st); //abcdc
    if(st.equals(stst.toString())){ 
        System.out.println("its same");
        return st; 
    }else if(st.equals(stst.toString()) == false){
        StringBuilder bucket = new StringBuilder();
        while(true){
            stst = stst.reverse();
            bucket.append(stst.charAt(0));
            stst = stst.deleteCharAt(0);
            System.out.println("bucket is .." + bucket);
            System.out.println("stst is >>>"+stst);
                if(stst.toString().equals(stst.reverse().toString()) == true){
                    System.out.println("stst equals stst reverse >> "+ stst);
                    bucket.reverse();
                    newSt = newSt.append(bucket);
                    System.out.println("bucket reverse append complete! newSt is>>> "+newSt);
                    break;
                }
        }
        return newSt.toString();
    }
    return "something is wrong!!";
}

 

StringBuilder 를 사용하였습니다.

기본적으로 stringbuilder 와 stringbuffer가 있습니다. 이것들에 대한 자세한 블로그를 첨부합니다. 

 

처음하시는 분들을 위한 자바(Java) 기초강의 - 23 [문자열을 다루는 StringBuilder 클래스, StringBuffer 클래스]

23강) StringBuilder 클래스, StringBuffer 클래스 지난 시간에 String 클래스에 대해서 알아보았습니다. 오늘은 그 String 클래스처럼 문자열을 다루는 "StringBuilder"라는 클래스와 "StringBuffer" 클래스를..

eskeptor.tistory.com

StringBuilder stst = new StringBuilder(st).reverse(); // abcdc
    StringBuilder newSt = new StringBuilder(st); //abcdc
    if(st.equals(stst.toString())){ 
        System.out.println("its same");
        return st;

stringbuilder의  유용한 메서드 reverse를 이용해서 일단 기본 문자열이 이미 회문인지 확인해보는게 좋겠습니다.

두개의 변수에  reverse한 문자열과 원본 문자열을 넣어줍니다. 

그리고 그 둘이 equals()한지를 확인해줍니다. 

 

else if(st.equals(stst.toString()) == false){
        StringBuilder bucket = new StringBuilder();
        while(true){
            stst = stst.reverse();
            bucket.append(stst.charAt(0));
            stst = stst.deleteCharAt(0);
            System.out.println("bucket is .." + bucket);
            System.out.println("stst is >>>"+stst);
            
                if(stst.toString().equals(stst.reverse().toString()) == true){
                    System.out.println("stst equals stst reverse >> "+ stst);
                    bucket.reverse();
                    newSt = newSt.append(bucket);
                    System.out.println("bucket reverse append complete! newSt is>>> "+newSt);
                    break;
                }
        }
        return newSt.toString();

st는 단순 String이고 stst는 stringbuilder로 지정을 햇습니다. 

그리고, bucket도 stringbuilder로 지정하여 이제 회문을 찾는 반복문을 생성해야겠습니다. 

일단, 조건은 st를 뒤집어봐도 같지 않은 경우입니다. 

 

그 상태로, 이제 stst를 다시 뒤집어줍니다. 왜냐하면 아까 잠깐 비교하는데 썼기 때문에. 뒤집는 것을 해주고, 이제 처음 문자열을 빼고 그 뺀문자는 bucket에 넣어줍니다. 그리고 나서 stst를 다시 정의해주고 비교를 해봅니다. 

 

이 경우 같은 경우 아까 버려둔 bucket의 문자열을 거꾸로 reverse 한 뒤 붙여주면? 가장 짧게 회문을 생성할 수 있습니다. 


이제 엘리트 분들의 답안을 감상하자... 

JAVA

String buildPalindrome(String s) {
    for (int i = 0; i < s.length(); i++) {
        if (isPalindrome(s.substring(i))) {
            StringBuilder sb = new StringBuilder();
            sb.append(s);
            for (int j = i - 1; j >= 0; j--) {
                sb.append(s.charAt(j));
            }
            return sb.toString();
        }
    }
    // Guaranteed not to get here
    //
    return "";
}

boolean isPalindrome(String s) {
    // Walk the string from head to tail
    // comparing characters at each side as we go
    //
    int h = 0;
    int t = s.length() - 1;
    while (h < t) {
        if (s.charAt(h) != s.charAt(t)) {
            return false;
        }
        h++;
        t--;
    }
    return true;
}

Python3

def buildPalindrome(st):
    for i in range(0,len(st)):
        if(st[i:len(st)] == st[i:len(st)][::-1]):
            return st[0:i] + st[i:len(st)] + st[0:i][::-1]
            

JS

function buildPalindrome(st) {
    if (isPalindrome(st))  return st;
    for (var i = 0; i < st.length; i++) {
        if (isPalindrome(st.slice(i, st.length))) {
            return st + Array.from(st.slice(0, i)).reverse().join('');
        }
    }
}

function isPalindrome(string) {
    return string == Array.from(string).reverse().join('')
}

 

 

공감 ♥ 버튼 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

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

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

#46_Code Signal Arcade >> Elections Winners  (0) 2020.05.18
#44_Code Signal Arcade >> Find Email Domain  (0) 2020.03.19
#43_Code Signal Arcade >> Is Beautiful String  (0) 2020.03.10
    'Algorithm/Java' 카테고리의 다른 글
    • #47_Code Signal Arcade >> Is MAC 48 Address?
    • #46_Code Signal Arcade >> Elections Winners
    • #44_Code Signal Arcade >> Find Email Domain
    • #43_Code Signal Arcade >> Is Beautiful String
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바