Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

난이도 : 브론즈 2
태그 : 구현, 정렬

 

 

설명

N개의 수를 오름차순 정렬하는 문제입니다.

정렬 알고리즘에는 정말 많은 알고리즘이 있습니다.

버블정렬, 선택정렬, 힙 정렬, 퀵 정렬, 기수 정렬, 병합 정렬 등등...

 

언어에서 자체적으로 제공하는 정렬 알고리즘은 보통은 굉장히 효율적이고, 많이 연구된 알고리즘을 사용하여

실제 개발에서는 정렬을 직접 구현하기 보단 언어에서 자체적으로 제공하는 메소드를 사용합니다.

하지만, 수 정렬하기 시리즈의 첫 번째 문제이니 만큼, 직접 알고리즘을 구현해 풀이해보겠습니다.

 

여러 알고리즘 중, 저는 구현하기 쉬운 선택 정렬을 사용하였습니다.

 

 

삽입정렬을 그림으로 나타내면 위와 같은데요.

가장 작원 원소를 왼쪽부터 채워나가며 순서를 정렬하는 방법입니다.

 

5, 10, 30, 2, 6, 34 라는 배열이 있을 때,

5와 이후의 가장 작은 원소인 2를 바꿉니다.

 

그러면 2, 10, 30, 5, 6, 34인 배열이 됩니다.

여기서 두번째 원소를 대상으로 또다시 진행하면, 이후 가장 작은 원소인 5와 10을 바꿉니다.

 

2, 5, 30, 10, 6, 34가 되었습니다.

위와 같은 방식으로 30과 이후 가장 작은 원소인 6과 맞바꿉니다.

 

2, 5 , 6, 10, 30, 34가 되었습니다.

모든 수가 정렬되었습니다.

 

 

 

소스코드

public class Main {
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		
		int count = sc.nextInt();
		int num[] = new int[count];
		
		for(int i = 0; i<count; i++)
		{
			num[i] = sc.nextInt();
		}
		
		for(int i = 0; i<num.length; i++)
		{
			for(int j = i; j<num.length; j++)
			{
				if(num[j] < num[i])
				{
					int temp = num[j];
					num[j] = num[i];
					num[i] = temp;
				}
			}
		}
		for(int i = 0; i<num.length; i++)
			System.out.println(num[i]);
	}
}

 

위의 알고리즘을 코드로 나타낸 것입니다.

 

 

후기

정렬 알고리즘을 배울 때 정말 많은 알고리즘을 배웠던 것 같은데,

버블정렬과 삽입정렬을 배울때엔 꽤 할만한데? 하다가,

퀵정렬과 힙정렬이 큰 빠따를 들고 나타났을 때, 매운맛에 정신을 못차린 기억이 남네요.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.