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

자료구조
Stringint[10] (카운팅 배열)알고리즘/기법
핵심 키워드
- 문제 분해
- 입력 문자열을 순회하며 이웃하는 수 간의 대소관계를 비교한다.
핵심 로직 흐름
if(String[i] < String[i+1]) swap String[i] and String[i+1]예외 처리
- 각 순회에서 마지막 인덱스에 도달한 경우, 스왑을 점검하지 않고 마친다.
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;
}
}
- 문제 분해
- 입력 문자열을 한 글자씩 보며
0~9등장 횟수를cnt[10]에 누적한다.9부터0까지 역순으로, 등장 횟수만큼 출력에 붙이면 내림차순이 된다.
핵심 로직 흐름
cnt[digit]++ for d = 9..0: append d, cnt[d]번예외 처리
- 한 자리 입력도 동일하게 처리
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
char를 교체하는 메소드를 몰라 참고 블로그를 확인하여 swap함수를 구현했었다 (풀이 1)String은 불변(immutable)이라 substring 기반 교체는 매번 새 문자열이 만들어져 비용이 커질 수 있다.0~9로 고정인 경우, 일반 정렬보다 카운팅 정렬이 더 간단하고 빠르다.비슷한 유형 (GPT 추천) :
확장 문제 (GPT 추천) :