제목 : 수 정렬하기
문제
N
개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N
(1 <= N
<= 1,000) 이 주어진다.
둘째 줄 부터 N
개의 줄에는 수가 주어진다.
이 수는 절대값이 1,000 보다 작거나 같은 정수이다.
수는 중복되지 않는다.
출력
첫째 줄 부터 N
개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
예제 입력 및 출력
예제 입력 | 예제 출력 |
---|---|
5 |
1 |
정렬 문제를 푸는 방식에는 2 가지 방식이 존재한다.
java.util.*
패키지에 존재하는 유틸 정렬 메서드로 처리하는 방식- 직접 정렬 메서드를 선언하여 처리하는 방식
어떠한 방식을 선택해도 상관이 없으나, 자바의 라이브러리들을 테스팅을 훌륭히 거친 상태이기 때문에,
정렬에 대한 깊은 이해를 먼저 하지 않고, 먼저 풀이를 원한다면 패키지를 사용하는 것이 좋은 선택이다.
하지만, 만약에
- 선택 정렬
- 버블 정렬
- 병합 정렬
- 힙 정렬
- 퀵 정렬
- ...
이러한 정렬 개념들을 이해하고 싶다면, 직접 작성 해 보는 것을 추천한다.
Java 패키지에는 이미 훌륭한 배열 정렬기가 존재하는데,
바로 Arrays
클래스이다.
유틸 클래스로서 배열을 위한 훌륭한 기능들을 지원하고 있다.
- 내부 값들을 일정한 규칙으로 정렬
- 이분 탐색
- 기본 타입 배열 내부를 어떠한 값으로 채우기
- 배열 내부를 원하는 규칙에 따라 채워넣을 수 있음.
- 문자열화 하여 프린팅이 가능하도록 만듬.
이러한 기능을 사용할 수 있다.
Answer 1 - Arrays 유틸 클래스 사용하기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N 번 만큼의 수가 주어진다.
int N = Integer.parseInt(br.readLine());
// N 번의 수를 담을 배열을 생성.
int[] arr = new int[N];
// while(N-- > 0) 을 사용해도 상관은 없음. - 인덱스가 중요하지 않은 부분.
for(int i = 0; i < N; i++)
arr[i] = Integer.parseInt(br.readLine());
// Arrays 유틸 메서드를 통한
Arrays.sort(arr);
// 결과값을 저장하기 위한 빌더 - 사실 String 객체에서 유틸성이 굉장히 올라가는 클래스
StringBuilder sb = new StringBuilder();
for(int i = 0; i < arr.length; i++)
sb.append(arr[i]).append("\n");
System.out.println(sb.toString());
}
}
그리고, 혹시라도 내 블로그를 차근차근 읽어가는 사람을 위해,
선택 정렬 방식으로 정렬하는 방법을 작성해 보도록 하겠다.
Answer 2 - 선택 정렬 방식 사용하기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N 번 만큼의 수
int N = Integer.parseInt(br.readLine());
// 길이 만큼의 배열 생성
int[] arr = new int[N];
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// 밑 부분에 작성하는 커스텀 정렬 메서드 선언.
selectionSort(arr);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append("\n");
}
System.out.println(sb.toString());
}
static void selectionSort (int[] arr) {
// 최소값을 넣게 될 인덱스 .
int currIdx = 0;
// 현재 최소 값인 인덱스 초기화
int minIdx = 0;
// 삽입 인덱스가 배열을 넘지 않도록 조정.
while(currIdx < arr.length) {
// 현재 인덱스부터 배열 끝 까지 탐색
for(int i = currIdx; i < arr.length; i++) {
// 만약 현재 인덱스가 최소값 인덱스의 값보다 작다면, 변경한다.
if(arr[minIdx] > arr[i]) {
minIdx = i;
}
}
// 하나의 루프를 돌고 나서, 최소값을 의미하는 인덱스를 넣어준다.
int temp = arr[minIdx];
arr[minIdx] = arr[currIdx];
arr[currIdx] = temp;
currIdx++;
minIdx = currIdx;
}
}
}