PS/Programmers

[level1, sort] 문자열 내림차순으로 배치하기

git-sun 2023. 3. 19. 00:24

1. 문제

 

 

 

 

 

2. 문제 해결 논리

  1. 문제 이해
    • 주어진 것
      • String s    //임의의 정렬할 문자열
    • 요구되는 것
      • String answer     //내림차순 정렬된 문자열
    •  
  2. 데이터 구조 결정
    • StringBuilder 사용
      • 문자열을 동적으로 생성 및 수정할 때 유용한 클래스
      • StringBuilder의 주요 메소드
        • append() : 문자열 뒤에 추가
        • insert() : 지정된 위치에 삽입
        • delete() : 지정된 시작과 끝 인덱스 사이의 문자열 삭제
        • replace() : 지정된 시작과 끝 인덱스 사이의 문자열을 다른 값으로 대체
        • reverse() : 문자열을 거꾸로 뒤집기
        • toString() : StringBuilder 객체를 String 객체로 변환하여 반환
    • 방법 1. 정렬 메소드 사용
      • Arrays.sort(정렬 대상, Comparator[정렬기준])
      • Collections.sort(정렬 대상, Comparator[정렬기준])
        • Comparator가 음수 반환 -> 오름차순 정렬
        • Comparator가 양수 반환 -> 내림차순 정렬
    • 방법 2. Stream API 사용
      • 함수형 프로그래밍 스타일로 데이터 처리
  3. 알고리즘 설계

       3-1. Character배열 -> Arrays.sort -> StringBuilder

       3-2. List -> Collections.sort -> StringBuilder

       3-3. Stream API

 

 

 

 

 

 

 

3. 코드 구현

 

    3-1. Character 배열 -> Arrays.sort -> StringBuilder

import java.util.*;

class Solution {
    public String solution(String s) {
    	//Charater배열 생성
        Character[] characters = new Character[s.length()];
		
        //String -> Character배열 변환
        for (int i = 0; i < s.length(); i++) {
            characters[i] = s.charAt(i);
        }
		
        //Arrays.sort메소드로 배열 내림차순 정렬
        Arrays.sort(characters, Comparator.reverseOrder());
		
        //StringBuilder 생성
        StringBuilder sb = new StringBuilder();
		
        //Character배열 -> StringBuilder 변환
        for (Character character : characters) {
            sb.append(character);
        }
        
        //StringBuilder -> String 변환 및 반환
        return sb.toString();
    }
}

 

 

 

 

    3-2. List -> Collections.sort -> StringBuilder

import java.util.*;

class Solution {
    public String solution(String s) {
    	//List 생성
        List<Character> characters = new ArrayList<>();
		
        //String -> List 변환
        for (int i = 0; i < s.length(); i++) {
            characters.add(s.charAt(i));
        }
		
        //Collections.sort로 List 내림차순 정렬
        //람다식 대신 Comparator.reversOrder()도 가능
        Collections.sort(characters, (a, b) -> b.compareTo(a));
		
        //StringBuilder 생성
        StringBuilder sb = new StringBuilder();
		
        
       	//List -> StringBuilder 변환
        for (Character character : characters) {
            sb.append(character);
        }
		
        
        //StringBuilder -> String 변환 및 반환
        return sb.toString();
    }
}

 

 

 

 

    3-3. Stream API

import java.util.Comparator;
import java.util.stream.*;

class Solution {
    public String solution(String s) {
    	//String -> IntStream 변환
        return s.chars()
        	
            //각 문자(int형)를 Character 객체로 변환 및 Stream으로 반환
            .mapToObj(c -> (char) c)
            
            //sorted,Comparator로 내림차순 정렬 및 Stream으로 반환
            .sorted(Comparator.reverseOrder())
            
            //각 Character 객체를 문자열로 변환 및 Stream으로 반환
            .map(String::valueOf)
            
            //정렬된 문자열을 하나의 문자열로 결합
            .collect(Collectors.joining());
    }
}

 

 

 

 

 

 

 

* Reference

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형