관리 메뉴

JIE0025

[코딩테스트입문][lv.0] 문자열뒤집기 - 자바(Java) 본문

알고리즘/프로그래머스

[코딩테스트입문][lv.0] 문자열뒤집기 - 자바(Java)

Kangjieun11 2022. 11. 22. 09:45
728x90

 

프로그래머스 > 코딩테스트입문 > 문자열뒤집기  

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/120822

 

 

 

 


 

✅  문제

문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000

 

 

입출력 예

my_stringreturn

"jaron" "noraj"
"bread" "daerb"

 

 

 

✅ 풀이 과정

풀이과정은 생략..

StringBuilder에 reverse()메서드가 있다는 걸 알게 돼서 기록한다.

 

 

✅ 내가 쓴 정답코드

class Solution {
    public String solution(String my_string) {
        String result ="";
        for (int i = my_string.length()-1; i>=0; i--){
            result += my_string.charAt(i);
        }

        return result;
    }
}

 

 

✅ 더 나은 다른사람의 코드

class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder(my_string);
        return sb.reverse().toString();
    }
}

마지막에 결과값을 스트링으로 리턴해주는것도 잊지 않기! 

 

 

✅ 문제를 풀기 위해 새롭게 학습한 것

 

- StringBuilder/ StringBuffer 에 reverse()가 있다. 

- StringBuilder/ StringBuffer 에 replace()도 있다!!! 문자열 처리에 아주 좋은 메서드인듯 ㅎㅎ

public StringBuffer replace(int start, int end, String str)
public static void main(String[] args){
		StringBuffer sb = new StringBuffer("01234567890");
		
		sb.reverse();
		System.out.println(sb);
		
		sb.replace(2, 5, "ehpub");
		System.out.println(sb);
	}

 

 

 

- 코딩테스트에 StringBuilder, StringBuffer, String중 어떤 것을 사용하면 좋을지 고민을 해보게 됐다.

 

 

StringBuffer

  • Thread-Safe하다.
  • 가변적이다.
  • 동기화를 지원한다. -> 오히려 나쁜 성능을 보일 수 있다.
  • 참조가 많은 경우 사용하면 good

- ex) 아래와 같은 경우엔 전역 변수로 선언해 여러 스레드에서 동시에 접근하기 때문에 StringBuffer를 쓰는 것이 좋다.

public class Test {
    static StringBuffer sb = new StringBuffer();
    
    public void method() {
    	sb.append("1");
        sb.append("2");
    }
}

 

 

StringBuilder

  • 동기화를 지원하지 않아 Thread-Safe하지 않지만, StringBuffer보다 연산처리가 빠르다.
  • 가변적이다.
  • 멀티 스레드 환경에서 문제가 발생될 수 있다.

- ex) 아래와 같은 경우엔 메서드를 실행할 때마다 스레드가 다른 객체를 사용해 StringBuilder를 사용하는 것이 좋다.

public class Test {
    public void method() {
	StringBuilder sb = new StringBuilder();
    	sb.append("1");
        sb.append("2");
    }
}

 

 

 

결론

1. 문자열 변경이 빈번하지 않는다면 String 사용을 고려

2. 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이라면 StringBuffer 사용을 고려

3. 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면 StringBuilder 사용을 고려

 

 

코딩테스트 테스트케이스 동작 환경이 스레드라고 생각한다면 ....???

머리가 아프니 좀더 알아보고  일단  나는 그냥 안전하게 String 아니면 StringBuffer를 써야겠다..

 

 

 

++ 추가

스트링 버퍼 써보려고 해서 굳이굳이 써봤는데 

append()함수로 스프링버퍼변수에 추가할때 유형 상관없이 추가가되는것을 알수있었따! 버퍼 최고!!

 

    public static String firstCharacter(String str) {
        if (str.equals("")) return "";

        StringBuffer sb = new StringBuffer();
        String[] splstr = str.split(" ");

        for(String s : splstr){
            sb.append(s.charAt(0));
        }

        return sb.toString();

    }

 

 





references