EXCELSIOR

[Level1]문자열 내림차순으로 배치하기 (ReverseStr) 본문

카테고리 없음

[Level1]문자열 내림차순으로 배치하기 (ReverseStr)

Excelsior-JH 2016. 10. 21. 10:11

1. 문제

reverseStr 메소드는 String형 변수 str을 매개변수로 입력받습니다.
str에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 String을 리턴해주세요.
str는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
예를들어 str이 "Zbcdefg"면 "gfedcbZ"을 리턴하면 됩니다.


2. 풀이

1)  내가 작성한 코드

- Arrays 클래스의 sort 메소드를 사용하여 해결하였다. 

- sort 메소드 자체가 오름차순으로 정렬하므로 StringBuffer클래스의 reverse메소드를 통해 역순으로 배치하였다.

import java.util.Arrays;
public class ReverseStr {
	public String reverseStr(String str){
		String arr[] = str.split("");
		Arrays.sort(arr);
		StringBuffer sf = new StringBuffer();
		for(int i=0; i<arr.length; i++)
			sf.append(arr[i]);
		return sf.reverse().toString();
	}

	// 아래는 테스트로 출력해 보기 위한 코드입니다.
	public static void main(String[] args) {
		ReverseStr rs = new ReverseStr();
		System.out.println( rs.reverseStr("Zbcdefg") );
	}
}

2) 다른 풀이
- 위의 풀이는 아무래도 클래스와 메소드만 가져다 썼을뿐 로직이 포함되어 있다고 생각하지 않았다.
- 다음 풀이는 이중 for문을 통해 문자간의 비교를 통해 해결하였다.(나는 언제쯤 저렇게 생각할 수 있을까...ㅜㅜ)
public class ReverseStr {
    public String reverseStr(String str){
    char[] chars = str.toCharArray();
     char temp =' ';

     for(int i = 0; i < str.length(); i++){
         for(int j = 0; j < str.length()-1 ; j++){
             if( chars[j] < chars[j+1]){
                 temp = chars[j];
                 chars[j] = chars[j+1];
                 chars[j+1] = temp;
             }
         }
     }
     str = new String(chars, 0, chars.length);
        return str;
    }

    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        ReverseStr rs = new ReverseStr();
        System.out.println( rs.reverseStr("Zbcdefg") );
    }
}

- 아래의 풀이는 StringBuilder 클래스를 통해 문제를 해결한 코드이다.

import java.util.Arrays;

public class ReverseStr {
    public String reverseStr(String str){
    char[] sol = str.toCharArray();
    Arrays.sort(sol);
    return new StringBuilder(new String(sol)).reverse().toString();
    }

    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        ReverseStr rs = new ReverseStr();
        System.out.println( rs.reverseStr("Zbcdefg") );
    }
}

3. 알아둘것

1) StringBuilder : StringBuffer와 같은 유형의 클래스

원하는 작업

StringBuilder 제공하는

필드 또는 메소드

사용

출력 결과

새로운 문자열을 뒤에 추가한다.

StringBuilder Append(string value)

StringBuilder strBldr

= new StringBuilder("Super");

strBldr.Append(" Star");

Console.WriteLine(strBldr.ToString());

Super Star

(해설: "Super" 뒤에 " Star" 추가되어 "Super Star" 됩니다.)

중간에 문자열을 삽입한다.

StringBuilder Insert(

int index, // 위치에

string value) // 삽입

StringBuilder strBldr

= new StringBuilder("Super Star");

strBldr.Insert(6, "Real ");

Console.WriteLine(strBldr.ToString());

Super Real Star

(해설: 현재 문자열의 6번째 위치는 두번째 S이고, 위치부터 문자열 "Real " 삽입됩니다.)

현재 문자열의 일부를 지운다.

StringBuilder Remove(

int startIndex, // 위치부터

int length) // length개의 문자들을 제거

StringBuilder strBldr

= new StringBuilder("Super Star");

strBldr.Remove(3, 5);

Console.WriteLine(strBldr.ToString());

Supar

문자열의 일부를 다른 것으로 대체한다.

StringBuilder Replace(

char oldChar, //

char newChar) // 교체

StringBuilder strBldr

= new StringBuilder("Super Star");

strBldr.Replace('S', 's');

Console.WriteLine(strBldr.ToString());

super star

StringBuilder Replace(

string oldValue, //

string newValue) // 교체

StringBuilder strBldr

= new StringBuilder(

"One little, two little Indians");

strBldr.Replace("little", "big");

Console.WriteLine(strBldr.ToString());

One big, two big Indians

StringBuilder Replace(

char oldChar, //

char newChar, // 교체

int startIndex, // 교체 범위의 시작 위치

int count) // startIndex ~ startIndex + count

StringBuilder strBldr

= new StringBuilder(

"One little, two little Indians");

strBldr.Replace('l', 'L', 0, 8);

Console.WriteLine(strBldr.ToString());

One Little, two little Indians

StringBuilder Replace(

string oldValue, //

string newValue, // 교체

int startIndex, // 교체 범위의 시작 위치

int count) // startIndex ~ startIndex + count

StringBuilder strBldr

= new StringBuilder(

"One little, two little Indians");

strBldr.Replace("little", "big", 15, 10);

Console.WriteLine(strBldr.ToString());

One little, two big Indians

StringBuilder 객체를 string 형으로 바꾼다.

string ToString()

StringBuilder strBldr

= new StringBuilder("Hello.");

Console.WriteLine(strBldr.ToString());

Hello.

형식에 맞춘 문자열을 추가하고 싶다.

AppendFormat(

string format,

params Object[] args)

string name1 = "Park", name2 = "Son";

StringBuilder strBldr

= new StringBuilder(

"One little, two little Indians");

strBldr.AppendFormat(

"\nTheir names: {0}, {1}",

name1, name2

);

Console.WriteLine(strBldr.ToString());

One little, two little Indians
Their names: Park, Son

[출처: http://www.dreamy.pe.kr/zbxe/CodeClip/158356]



2) String과 StringBuffer, StringBuilder 차이


① String

      • String 객체는 immutable 이다. 즉, 한번 생성되면 String 객체가 변할 수 없다.

      • 문자열, 숫자, char 등을 concat 할때는 StringBuffer, StringBuilder 를 사용할 수 있지만 단순한 경우에는 + 를 활용해 직접 합쳐도 된다.



② StringBuffer와 StringBuilder 차이점

      • 기본적으로 두 클래스가 제공하는 메소드는 동일하지만 StringBuffer는 멀티 쓰레드 상태에서 동기화를 지원한다. (각 메소드 별로 synchronized 키워드가 존재)

      • String 을 + 를 활용해 합치는 경우 매번 인스턴스를 생성하기 때문에 성능상에 이슈가 많다. 이런 성능 이슈를 개선하기위해 JDK 1.5 버전 이후에는 컴파일 단계에서 StringBuilder로 컴파일 되도록 변경되기 때문에 + 를 활용해도 성능상에 큰 이슈는 없다.


Comments