1. 삽입정렬(insertion sort) 란?

 - 각 단계 마다 하나의 원소를 그 앞의 원소들과 비교를 해서 자신의 자리를 찾아 가는 것이다.

 - 첫 번째 원소는 처음에는 혼자이므로 그 자체로 정렬된 상태이고 두번째 원소부터 비교를 하며 정렬을 한다

 - 첫번째 와 두번째 원소를 비교를 제대로 했다면 3번째 원소를 정렬 할때는 3번째 원소 앞쪽은 정렬이 되어있는 상태일 것 이다.

 - 그럼 세번째 원소가 이제 자신의 자리를 찾으러 갈 것이고 네번째 원소가 비교를 시작하려 할 때는 앞의 3개의 원소는 정렬된 상태

 - 그리고 비교를 해가면서 원소의 자리가 바뀔 수 있기 때문에 자신의 차례때 배정받은 위치가 최종출력의 위치는 아니다.

 

2. 최악의 경우 (worst case) 

 - 키 오름차순 정렬을 하고 싶다고 가정했을 때, 계속 키가 제일 작은 사람이 차례대로 들어오는 것이다.

   ( 즉, 입력이 역순으로 정렬되어 있을 때)   -->  Θ(n^2)

 

3. 평균의 경우 (Average Analysis)

 - 각 자리에 들어갈 확률은 모두 같다고 가정 (1/i+1) -->>내가 원소로 들어갔을 때 그자리도 포함 i+1

 - step i에서 평균 i/2의 연산

 - 평균 분석의 경우 대략 n^2/4 정도 이다. 

 

4.특징

 - input의 크기가 적을 때에 한정해서 매우 빠르다고 알려져있다.

 - 한번에 잘못된 위치를 하나만 수정할 수 있는 제한적인 조건 내에서는 최적의 알고리즘 이다.

 

5. 구현 (key값을 그냥 입력받은 int의 수라고 가정하고 , 그냥 vector<int>의 각 index에 해당하는 값을 통한 정렬을 구현)

'알고리즘 > 정렬 (sorting)' 카테고리의 다른 글

5. Radix sort (기수 정렬)  (0) 2020.04.19
4. Heap sort (힙 정렬)--(2)  (0) 2020.04.16
4. Heap sort (힙 정렬)--(1)  (0) 2020.04.16
3. Merge Sort (합병정렬) -구현  (0) 2020.04.15
2. Quick sort(퀵 소트) -구현  (0) 2020.04.14

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

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 영어 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.

www.acmicpc.net

그냥 모든 경우의 수를 입력 받은 후 (듣지 못하는 사람) 을 보지 못하는 사람을 입력받을 때 

 

듣지 못하는 사람 전체와 비교를 하면 시간 초과가 뜹니다 (n,m이 무려 500,000이기 때문에 )

 

그래서 오랜만에 binarysearch를 직접 구현하여 문제를 해결 하였습니다.

 

그리고 문제에서 사전 순 배열을 원하였으므로 중간에 sort를 사용하시면 됩니다.

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 1059  (0) 2019.12.31
백준 16212  (0) 2019.12.31
백준 16433  (0) 2019.12.31
백준 10995  (0) 2019.12.30
백준 15947  (0) 2019.12.30

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

정렬에 관련된 문제입니다.

 

sorting을 하면서 조건을 조금씩만 걸어서 주면 되는 문제이구요

 

compare 을 선언해서 sort를 하는데 조건으로 사용하였고

 

같은 문자가 있는경우 생략해서 출력해야 하는데 이는 입력을 받을때나 또는 따로 비교를 해서 제거를 하려 하면

 

비교를 하는데 있어서 따로 시간을 또 사용해야 할 것 같아서

 

출력을 할때 비교하여 생략하는 방식으로 구현하였습니다.

 

'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글

백준 1620 [C++]  (0) 2021.01.09
백준 2887 [C++]  (0) 2020.10.27
백준 10825 [C++]  (0) 2020.10.25
백준 10814  (0) 2020.03.02
백준 1427  (0) 2020.01.08

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

 

16212번: 정열적인 정렬

형준이는 수열을 하나 가지고 있다. 형준이는 수열을 정열적으로 정렬해보려 한다. 과연, 정렬할 수 있을까?

www.acmicpc.net

 

기본적인 정렬을 할줄 아는지 물어보기 위한 문제 인듯 싶네요

 

c++에서 정렬은 

 

sort(arr.begin(),arr.end()) 이렇게 하고

 

내림차순, 오름 차순이냐에 따라 greater<int> () 를 파라미터로 추가 해주느냐 마느냐 결정하시면 될 듯 합니다.

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 1764 : 듣보잡  (0) 2020.03.26
백준 1059  (0) 2019.12.31
백준 16433  (0) 2019.12.31
백준 10995  (0) 2019.12.30
백준 15947  (0) 2019.12.30

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

- 입력받은 점을 x좌표 우선비교 하고 출력( 같을 경우는 y좌표를 비교하여 순서대로 출력)

- 문제는 매우 간단한데 

- int형 vector array를 선언해서 (2차원 배열 느낌)

- 입력받은 x,y 를 arr[x].push_back(y) 를 하여 일단 x값 대로 for문을 돌다가

- size가 1 일경우 -> 그대로 출력[0]번째(arr[i][0])

- size가 2 이상이면 -> 그 vector array를 sort하여(y값 오름차순 정렬) 순서대로 출력

 

@@ 비효율적이다...... 더 컴팩트하게 짤 수있을텐데.. 생각해볼게요.... @@

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 1874 스택수열  (0) 2019.11.14
백준 2292 벌집  (0) 2019.11.13
백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10

+ Recent posts