일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 아셈듀오 후기
- 패스트캠퍼스 #자료구조 #코딩테스트 #배열
- 공모전후기
- 무신사 데이터분석
- CRM
- 키워드시각화
- 태블로 포트폴리오
- 데이터 분석 포트폴리오
- 교환학생주거
- 파이썬
- 데이터공모전
- tableau
- 미래에셋 공모전
- 교환학생 장학금
- 리뷰분석
- MairaDB
- 아셈듀오
- 교환학생
- 제네바기숙사
- 제네바주거
- HEG
- 테이블계산
- 텍스트분석 시각화
- 두잇알고리즘코딩테스트
- 아셈듀오 선정
- 데이터 포트폴리오
- 태블로
- 데이터 시각화 포트폴리오
- 제네바
- 제네바경영대학교
- Today
- Total
민듀키티
알고리즘 코딩테스트 - 정렬(버블, 선택, 삽입) 본문
각 정렬의 핵심이론과 관련 백준 문제를 정리해보았습니다 😍
1. 버블정렬 핵심이론
- 시간복잡도 : O(n2)
- 원리 시각화
- 바로 옆의 데이터와 비교해서, swap 조건에 부합하면 swap함
- 이러한 비교를 거쳐서, 오름차순일 경우 가장 큰 수가 오른쪽, 내림차순일 경우 가장 큰 수가 왼쪽에 위치하게 됨
- no swap 만 일어남 ? : 모두 정렬이 되었다는 의미
백준 문제로 버블 정렬 코드 짜보기 !! 🍀
백준 2750 : 버블정렬
https://www.acmicpc.net/problem/2750
2750번: 수 정렬하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
sort 함수를 이용하여 쉽게 풀 수 있지만, 버블정렬 단원이기 때문에, 버블정렬 개념을 이용하여 풀이하려고 합니다 !
- 버블정렬은 인접요소끼리 비교하고, 정렬이 필요하다면 swap을 해줌
- 버블정렬을 통해 루프를 하나씩 돌때마다, 가장 큰 수는 제일 오른쪽에 정렬이 됨
- 따라서, 두번째 for 문에서 n-1-i를 해주는 것임 (여기서 i는 몇 번째 루프인가 ? 를 뜻함)
# 백준 2750번
import sys
input = sys.stdin.readline
#입력받기
n = int(input())
a = list()
for i in range(n) :
a.append(int(input()))
for i in range (n-1) :
for j in range (n-1-i) :
if a[j] > a[j+1] :
temp = a[j]
a[j] = a[j+1]
a[j+1] = temp
for i in range(n) :
print(a[i])
2. 선택정렬 핵심이론
- 시간복잡도 : O(n2)
- 원리 시각화 : 말 그대로 정렬하는 숫자를 "선택" 하는 정렬법임
- 오름차순으로 정렬할 경우 최솟값을, 내림차순으로 정렬할 경우 최댓값을 찾음
- 찾은 데이터와 가장 앞에 있는 데이터를 swap 시켜줌 -> 선택된 데이터는 정렬이 되어짐
- 남은 데이터를 위와 같은 방법으로 반복 (swap이 일어나지 않을 때까지)
백준 문제로 선택정렬 코드 짜보기 !! 🍀
백준 1427 : 선택정렬
https://www.acmicpc.net/problem/1427
1427번: 소트인사이드
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
선택정렬을 이용하는 문제! 코딩테스트에서는 잘 안나온다고 합니다. 그러나, 문제 속에 사용될 수 있기 때문에 알고가야하는 개념입니다 !
- 내림차순으로 정렬하는 문제는 "최댓값" 찾기, 오름차순으로 정렬하는 문제는 "최솟값" 찾기
- 최댓값을 찾고, 가장 앞 부분에 있는 데이터와 swap 해줌 ( 선택정렬의 개념)
- 루프 하나를 돌 때마다, 제일 앞 부분의 값이 고정됨
- 예제 출력 값을 보면, 줄바꿈해서 출력하지 않음. 따라서, 아래의 코드를 사용해줍니다 !
print = sys.stdout.write
# 백준 2750번
import sys
print = sys.stdout.write #줄바꿈출력 안하도록
input = sys.stdin.readline
# 입력받기
a = list(input())
for i in range(len(a)-1) :
max = i
for j in range(i+1, len(a)) :
if a[j] > a[max] :
max = j
if a[i] < a[max] :
temp = a[i]
a[i] = a[max]
a[max] = temp
for i in range(len(a)-1) :
print(a[i])
3. 삽입정렬 핵심이론
- 시간복잡도 : O(n2)
- 원리 시각화 : 말 그대로, 현재 데이터를 적절한 위치에 "삽입" 하는 정렬 방법임
- 두번째 데이터부터 선택하여, 삽입될 위치를 탐색함
- 삽입 위치로 선택된 데이터를 옮겨주고, 삽입위치부터 현 위치 (index위치)까지 shift 연산을 수행해줌 (즉, 한 칸씩 옆으로 이동해준다) -> 이것이 시간복잡도가 O(n2) 나오는 이유임
- 선택할 데이터가 없을 때까지 위의 과정을 반복해줌
- 추가로 4번째 데이터 경우, 5보다 큰 값이 없으므로 현재 자리가 적절함. 따라서 이동이 없음
백준 문제로 삽입정렬 코드 짜보기 !! 🍀
백준 11399 : ATM인출 시간 계산하기
https://www.acmicpc.net/problem/11399
11399번: ATM
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net
# 백준 11399번
import sys
n = int(input())
a = list(map(int,input().split()))
s = [0] * n #합배열
for i in range(n) :
insert_point = i
insert_value = a[i]
for j in range(i-1, -1, -1) : #뒤에서부터 출력해주기
if a[j] < a[i] :
insert_point = j+1
break
if j == 0 : #끝까지 탐색하는 경우
insert_point = 0
for j in range(i,insert_point, -1):
a[j] = a[j-1]
a[insert_point] = insert_value
s[0] = a[0]
sum = 0
for i in range(1, n) :
s[i] = s[i-1] + a[i]
sum += s[i]
print(sum)
* do it 알고리즘 코딩테스트 내용을 참고하였습니다.
'Coding Test' 카테고리의 다른 글
프로그래머스 Python 코딩테스트 (LEVEL 1 - 6) (0) | 2023.07.31 |
---|---|
알고리즘 코딩테스트 (깊이우선탐색) (1) | 2023.03.20 |
알고리즘 코딩테스트 - 자료구조(스택과 큐) (0) | 2023.03.10 |
알고리즘 코딩테스트 - 자료구조 (투포인터, 슬라이딩 윈도우) (0) | 2023.03.06 |
알고리즘 코딩테스트 - 자료구조 (배열, 리스트, 구간합) (1) | 2023.03.03 |