728x90
반응형
1. 선택 정렬
: 대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 선택해 정렬
-> 구현 방법이 복잡함에도 불구하고, 시간 복잡도 또한 O(n^2)로 효율적이지 않아 사용하지 않는다.
(1) 구현 원리
: 최솟값 또는 최댓값을 찾고, 남은 정렬 부분의 가장 앞의 데이터와 swap해 정렬
- 남은 정렬 부분에서 최솟값 또는 최댓값을 찾는다.
- 남은 정렬 부분에서 가장 앞의 데이터와 선택된 데이터를 swap
- 가장 앞의 데이터 위치를 변경해 (index++) 한 후 남은 정렬 부분의 범위를 축소
- 전체 데이터 크기만큼 index가 커질 때까지 == 남은 정렬 부분이 없을 때까지 반복
문제 17. 내림차순으로 자릿수 정렬하기 #
수가 주어지면 그 수의 각 자릿수를 내림차순으로 정렬하시오.
입력
첫 번째 줄에 정렬할 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수다.
출력
첫 번째 줄에 자릿수를 내림차순 정렬한 수를 출력한다.
예제 입력 1
2143
예제 출력 1
4321
1단계. 문제 분석하기
- 자릿수별로 정렬하므로, 숫자를 각 자릿수별로 나눈다.
- substring() 함수를 이용해 자릿수 단위로 분리후, 다시 int형으로 변경해 배열로 저장
- 선택정렬을 이용해, 배열 내림차순 정렬 // 정렬 함수를 이용해도 된다.
2단계. 손으로 풀어 보기
- String 변수로 정렬할 데이터를 받고, int형 배열에 저장
substring()함수를 사용해 숫자를 각 자릿수별로 나눈 후 배열에 저장 - 배열의 데이터를 선택 정렬 알고리즘을 이용해 내림차순 정렬
-> 최댓값을 찾아 기준이 되는 자리와 swap
3단계. 슈도코드 작성하기
str(정렬할 수)
A(자릿수별로 구분해 저장한 배열)
for(str의 길이만큼 반복하기) {
A 배열 저장 -> str.substring 사용하기
}
for(i : 0 ~ str의 길이만큼 반복하기){
for(j : i + 1 ~ str의 길이만큼 반복하기) {
현재 범위에서 max값 찾기
}
현재 i의 값과 max값 중 max값이 더 크면 swap 수행하기
}
A 배열 출력하기
package sorting.ch04;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class sorting_q17 {
public int solution(int n) {
int answer=0;
String tmp = Integer.toString(n);
char[] arr =tmp.toCharArray();
Character [] arr2 =new Character[arr.length];
for(int i=0;i<arr.length;i++) arr2[i]=arr[i];
Arrays.sort(arr2, Collections.reverseOrder());
for(int i=0;i<arr.length;i++) arr[i]=arr2[i];
tmp=String.valueOf(arr);
answer=Integer.parseInt(tmp);
return answer;
}
public static void main(String[] args) {
sorting_q17 T = new sorting_q17();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
System.out.println(T.solution(n));
}
}
-> 내림차순을 이용하기위해 기본형으로 배열을 선언했다.
Character [] arr2 =new Character[arr.length];
Arrays.sort(arr2, Collections.reverseOrder());
+) 세련된 풀이
package sorting.ch04;
import java.util.Scanner;
public class sorting_q17_sol {
public void solution(String str, int[] arr) {
for (int i = 0; i < str.length(); i++) {
int max = i;
for (int j = i + 1; j < str.length(); j++) {
if (arr[j] > arr[max])
max = j;
//최댓값 찾기
}
if (arr[i] < arr[max]) {
//현재 swap 대상 위치가 최댓값이 아니면 swap
int tmp = arr[i];
arr[i] = arr[max];
arr[max] = tmp;
}
}
for (int x : arr)
System.out.print(x);
}
public static void main(String[] args) {
sorting_q17_sol T = new sorting_q17_sol();
Scanner kb = new Scanner(System.in);
String str = kb.next();
int[] arr = new int[str.length()];
for (int i = 0; i < str.length(); i++)
arr[i] = Integer.parseInt(str.substring(i, i + 1));
//i부터 i+1 전까지 즉, i번째를 가리킴
T.solution(str, arr);
}
}
728x90
반응형
'Java > Java 알고리즘' 카테고리의 다른 글
[알고리즘] 1-4. 퀵 정렬 [재귀 함수 이용] (0) | 2022.06.28 |
---|---|
[알고리즘] 1-3. 삽입 정렬 # (0) | 2022.06.27 |
[알고리즘] 문제 풀이 순서 정리 (0) | 2022.06.27 |
[알고리즘] 1-1. 버블 정렬 # (0) | 2022.06.27 |
[알고리즘] 1. 정렬 (0) | 2022.06.27 |