본문 바로가기

ALGORITHM

[프로그래머스 Java] 문자열 내림차순으로 배치하기

 

코딩테스트 연습 - 문자열 내림차순으로 배치하기

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로

programmers.co.kr

⏱소요 시간 - 45분

 

🔑해결 방법

 

 

[백준 2908 Java] 문자열 뒤집기 - StringBuffer / StringBuilder

StringBuffer 클래스를 이용하여 문자열을 뒤집을 수 있다. 문자열을 내림차순으로 배치하는 것이랑은 다르므로 주의!! StringBuffer().append(str) str 데이터를 현재 문자열 끝에 추가 StringBuffer().append(st..

dblee.tistory.com

 

이 방법으로 풀었더니 에러 파티가 열렸다...

이론상으로 다를 게 없어 보였는데 문자열을 뒤집는 것이랑 내림차순 정렬하는 것은 엄연히 다르다.

 

예를 들어, "aBcDeFg"는

문자열을 뒤집으면 "gFeDcBa"라는 결과가

내림차순 정렬하면 "gecaFDB"라는 결과가 나온다. (내림차순이므로 소문자 -> 대문자 순으로 전개)

 

즉, 시작부터 뒤집을 것이 아니라, 일단 정렬을 하고 뒤집으라는 것이다. 이건 다른 사람이 푼 코드에서 살펴보자.

 

 

내가 푼 방법은 아래와 같다.

 

1. String -> String[] 변환

String[] arr = s.split(""); --> 오늘 또 새로운 방법을 알아냈다ㅎㅎ

 

2. String[] 내림차순 정렬

오늘 정리한 Comparator를 구현해서 작성했다.

 

3. String[] -> String 변환

StringBuffer를 만들어서 String[]의 요소들을 하나씩 꺼내며 buffer에 append하는 형식으로 전개했다.

 

간단한 문제였지만 몰랐던 부분들을 많이 알게 되었다.

StringBuilder도 정말 자주 나와서 한번 정리해야겠다!

 

 

🔎소스 코드

 

package step1;

import java.util.Arrays;
import java.util.Comparator;

// 문자열 내림차순으로 배치하기
public class Ex15 {

	public static void main(String[] args) {
		
		System.out.println(solution("Zbcdefg"));
		System.out.println(solution("aBcDeFg"));
		
	}
	
	public static String solution(String s) {
		
		String answer = "";
	
		// 1. String -> String[] 변환
		String[] arr = s.split("");
		
		// 2. String[] 내림차순 정렬 정의
		Arrays.sort(arr, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}

		});
		
		// 3. String[] -> String 변환
		StringBuffer sb = new StringBuffer();
		
		for(int i = 0; i < arr.length; i++) {
				sb.append(arr[i]);
		}
		
		answer = sb.toString();
		
		return answer;
	}
	
}

 

 

🔎다른 사람의 코드 [ StringBuilder 사용 ]

 

내 코드는 뭔가 날것으로... 너무 풀어서 쓴 코드여서 간략한 코드들이 많아 가지고 왔다.

첫 번째 코드는 위에서 언급했던 StringBuilder를 사용한 코드이다.

 

1. String -> char[] 로 변경 : String의 toCharArray() 메서드 사용

char[] arr = s.toCharArray();

 

2. char[] -> String -> StringBuilder로 변경

StringBuilder sb = new StringBuilder(new String(arr));

 

3. StringBuilder 상태로 뒤집고 -> String 으로 변경

sb.reverse().toString();

 

package step1;

import java.util.Arrays;

// 문자열 내림차순으로 배치하기
public class Ex15_2 {

	public static void main(String[] args) {
		
		System.out.println(solution("Zbcdefg"));
		System.out.println(solution("aBcDeFg"));
		
	}
	
	public static String solution(String s) {
		
		String answer = "";
		
		char[] arr = s.toCharArray();
		
		Arrays.sort(arr); // 오름차순 정렬
		
		// char[] -> String -> StringBuilder
		StringBuilder sb = new StringBuilder(new String(arr));
		
		// StringBuilder의 reverse()로 정렬 뒤집기 = 내림차순
		// toString()으로 다시 String형으로 변환
		answer = sb.reverse().toString();
		
		return answer;
		
	}
	
}

 

 

🔎다른 사람의 코드 [ Collections.reverseOrder() 사용 ]

 

1. String -> String[]로 변경 : split("") 

 

2. Collections의 reverseOrder() 메서드 사용

Arrays.sort(arr, Collections.reverseOrder());

 

3. String 클래스의 join()을 사용하여 문자열 합치기

String.join("", arr); // arr 배열을 ""을 기준으로 문자열로 합쳐라

 

** join() 메서드에 대해 더 알아보자면,

각각의 String을 하나의 String으로 합쳐주거나 Array(배열)을 하나의 String으로 바꿔주는 메서드이다.

join()은 static 메서드이기 때문에 String.join() 처럼 클래스명으로 바로 부른 것을 확인할 수 있다.

 

String animals = "dog, car, bear";

String[] arr = animals.split(","); // , 을 기준으로 잘라서 arr[]에 넣어라

String str = String.join("-", arr); // 배열의 문자열을 '-'로 구분해서 결합해라

System.out.println(str);

 

package step1;

import java.util.Arrays;
import java.util.Collections;

// 문자열 내림차순으로 배치하기
public class Ex15_1 {

	public static void main(String[] args) {
		
		System.out.println(solution("Zbcdefg"));
		System.out.println(solution("aBcDeFg"));
		
	}
	
	public static String solution(String s) {
		
		String answer = "";
		
		String[] arr = s.split("");
		
		Arrays.sort(arr, Collections.reverseOrder());
		
		answer = String.join("", arr);
		
		return answer;
		
	}
	
}