[백준 문제 풀이] 1427번 소트인사이드

Junu Kim·2025년 12월 28일
post-thumbnail

[1427] 소트인사이드

난이도: ★☆☆☆☆ • solved on: 2025-12-28


문제 요약

  • 문제 유형: 문자열 처리, 정렬
  • 요구사항: 입력된 수의 각 자리 숫자를 내림차순으로 정렬하여 출력해야 한다.

사용 개념

  1. 자료구조

    • String
    • int[10] (카운팅 배열)
  2. 알고리즘/기법

    • 버블 정렬 형태의 반복 교환
    • 카운팅 정렬
  3. 핵심 키워드

    • 자리수 분해
    • 내림차순 정렬 (descending sort)
    • 문자열 불변 (immutable)

풀이 아이디어 및 코드

풀이 1 : 버블 정렬

  1. 문제 분해
  • 입력 문자열을 순회하며 이웃하는 수 간의 대소관계를 비교한다.
  1. 핵심 로직 흐름

    if(String[i] < String[i+1]) 
    swap String[i] and String[i+1]
  2. 예외 처리

    • 각 순회에서 마지막 인덱스에 도달한 경우, 스왑을 점검하지 않고 마친다.
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int count = 0;
        while(true){
            count = 0;
            for(int i = 0; i < s.length(); i++){
                if(i == s.length()-1){
                    break;
                }
                if(s.charAt(i) < s.charAt(i+1)){
                    s = swap(i, i+1, s);
                    count++;
                }
            }
            if(count == 0){
                break;
            }
        }
        System.out.println(s);
    }
    public static String swap(int idx1, int idx2, String s){
        char temp = s.charAt(idx1);
        s = s.substring(0, idx1) + s.charAt(idx2) + s.substring(idx1 + 1);
        s = s.substring(0, idx2) + temp + s.substring(idx2 + 1);
        return s;
    }
}

풀이 2 : 카운팅 정렬

  1. 문제 분해
  • 입력 문자열을 한 글자씩 보며 0~9 등장 횟수를 cnt[10]에 누적한다.
  • 9부터 0까지 역순으로, 등장 횟수만큼 출력에 붙이면 내림차순이 된다.
  1. 핵심 로직 흐름

    cnt[digit]++
    for d = 9..0:
        append d, cnt[d]번
  2. 예외 처리

    • 한 자리 입력도 동일하게 처리
import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine().trim();

        int[] cnt = new int[10];
        for (int i = 0; i < s.length(); i++) {
            cnt[s.charAt(i) - '0']++;
        }

        StringBuilder sb = new StringBuilder();
        for (int d = 9; d >= 0; d--) {
            for (int k = 0; k < cnt[d]; k++) sb.append(d);
        }

        System.out.print(sb);
    }
}

시간·공간 복잡도

풀이 1

  • 시간 복잡도: 최악 기준 대략 O(N³)

  • 공간 복잡도: O(N) (문자열이 반복 생성됨)

풀이 2

  • 시간 복잡도: O(N)
  • 공간 복잡도: O(1)

어려웠던 점

  • 특정 인덱스에 있는 char를 교체하는 메소드를 몰라 참고 블로그를 확인하여 swap함수를 구현했었다 (풀이 1)

배운 점 및 팁

  • String은 불변(immutable)이라 substring 기반 교체는 매번 새 문자열이 만들어져 비용이 커질 수 있다.
  • 숫자 범위가 0~9로 고정인 경우, 일반 정렬보다 카운팅 정렬이 더 간단하고 빠르다.

참고 및 링크


추가 연습 문제

profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글