본문 바로가기

Study

(16)
쉘 정렬 (shell sort) 1. 쉘 정렬(Shell sort) : 가장 오래된 정렬 알고리즘의 하나로, 삽입 정렬을 기본으로 삽입 정렬을 보완한 알고리즘이다. 삽입 정렬은 요소들이 삽입될 때, 이웃한 위치로만 이동한다. 즉, 삽입되어야 할 위치가 현재 위치에서 멀리 떨어져있다면 여러번의 이동을 거쳐야만 제자리로 갈 수 있다. 이러한 점을 보완한 알고리즘이 쉘 정렬이다. 정렬해야 할 리스트의 각 k번째 요소를 추출해서 부분 리스트 생성, 이때 k를 간격(gap)이라고 한다. 간격의 초기값은 보통 2로 나눈 값으로 진행하는데, 3으로 나눈 후 1을 더하는 경우가 더 빠르다고 알려져있다. 즉, N/2 보다 (N/3) + 1이 더 빠르다는 얘기이다. 각 회전마다 간격 k를 절반으로 줄인다. 즉, 각 회전이 반복될 때마다 하나의 부분 리스..
기본 정렬 - 삽입 정렬 (insertion sort) 1. 삽입 정렬(Insertion sort) : 삽입 정렬은 두 번째 자료부터 시작하여 그 앞(왼쪽)의 자료들과 비교하여 삽입할 위치를 지정한 후 자료를 뒤로 옮기고 지정한 자리에 자료를 삽입하여 정렬하는 알고리즘이다. 즉, 두 번째 자료는 첫 번째 자료, 세 번째 자료는 두 번쨰와 첫 번째 자료, 네 번째 자료는 세 번째, 두 번째, 첫 번째 자료와 비교한 후 자료가 삽입될 위치를 찾는다. 자료가 삽입될 위치를 찾았다면 그 위치에 자료를 삽입하기 위해 자료를 한 칸씩 뒤로 이동시킨다. 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다. 2. 예제 - 배열에 7, 4, 2, 6, 1 이 저장되어있다고 가정 -> 오..
기본 정렬 - 버블 정렬 (bubble sort) 알고리즘 1. 버블 정렬(Bubble sort) : 버블 정렬은 첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세 번째 자료를, 세 번째와 네 번째, .... 이런식으로 (마지막 - 1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬한다. 서로 인접한 두 우너소를 검사하여 정렬하는 알고리즘이다. - 인접한 두 개의 레코드를 비교하여 순서가 맞지 않으면 서로 교환 하는 방식 1회전을 수행하고 나면 가장 큰 자료가 맨 뒤로 이동하므로 2회전에서는맨 끝에 있는 자료는 정렬에서 제외, 2회전을 수행하고 나면 끝에서 두 번째 자료까지는 정렬에서 제외된다. 이렇게 정렬을 1회전 수행할 때마다 정렬에서 제외되는 데이터가 하나씩 증가한다. 2. 예제 - 배열에 1, 6, 4, 5, 3 이 저장되어있다고 가정 ->..
기본 정렬 - 선택 정렬(selection sort) 알고리즘 1. 선택 정렬 (Selection sort) : 선택 정렬은 첫 번째 자료를 두 번째 자료부터 마지막 자료까지 차례대로 비교하여 가장 작은 값을 첫 번째에 놓고, 두 번째 자료를 세 번째 자료부터 마지막 자료까지와의 차례대로 비교하여 그 중 가장 작은 값을 찾아 두 번째 위치에 놓는 과정을 반복하며 정렬을 수행하게 된다. 제자리 정렬(in-place sorting) 알고리즘의 하나 - 정렬되지 않은 값들 이외에 다른 추가 메모리를 요구하지 않는 정렬 방법이다. 1회전을 수행하고 나면 가장 작은 값의 자료가 맨 앞에 오게 되므로 다음 회전에서는 두 번째 자료를 가지고 비교한다. ​ 2. 예제 - 배열에 1, 6, 4, 5, 3 이 저장되어있다고 가정 -> 오름차순 정렬 1회전 : ​ 2회전 : 3회전 :..
14단계 정렬 1. 단어 정렬 (문제번호 : 1181) 문제 : 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오. 길이가 짧은 것부터 길이가 같으면 사전 순으로 입력 : 첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. 출력 : 조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java...
13단계 브루트 포스 1. 블랙잭 (문제 번호 : 2798) 문제 : 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버젼의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장..
11단계 재귀 1. 피보나치 수5 (문제 번호 : 10870) 문제 : 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. 입력 : 첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다. 출력 : 첫째 줄에 n번째 피보나치 수를 출력한다. import java.util.Sca..
10단계 수학 2 1. 소수 구하기 (문제 번호 : 1929) -> 에라토스테네스의 체를 이용하여 소수 구하기 *에라토스테네스의 체 소수인 2를 제외한 2의 배수를 지우고 남은 수 중 또 다른 소수인 3을 제외한 3의 배수를 지워가면서 남는 소수를 구하는 방법 문제 : M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오. 입력 : 첫째 줄에 자연수 M과 N이 빈칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) 출력 : 한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다. import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); ..