일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 하이브
- Java
- C
- 주식분석
- LSTM
- 하둡2
- recursion
- GRU
- hive
- 텐서플로
- tensorflow
- C언어
- python
- 파이썬
- codingthematrix
- effective python
- 선형대수
- NumPy
- yarn
- 알고리즘
- scrapy
- RNN
- collections
- Sort
- HelloWorld
- 코딩더매트릭스
- graph
- 딥러닝
- hadoop2
- 그래프이론
- Today
- Total
EXCELSIOR
[Level1]문자열 내림차순으로 배치하기 (ReverseStr) 본문
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") ); } }
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 |
[출처: 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로 컴파일 되도록 변경되기 때문에 + 를 활용해도 성능상에 큰 이슈는 없다.