정화 코딩

EDOC 2023-2 4주차 과제 본문

Group/EDOC

EDOC 2023-2 4주차 과제

jungh150c 2023. 11. 6. 14:26

04-3. 삽입 정렬

 

018. ATM (백준 11399번)

 

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

 

from sys import stdin

n = int(stdin.readline())
data = list(map(int, stdin.readline().split()))

for i in range(1, n):
    value = data[i]
    for j in range(i-1, -1, -1):
        if(data[j] > value):
            data[j+1] = data[j]
        else:
            data[j+1] = value
            break
        if(j==0):
            data[0] = value

sum = 0
for i in range(0, n):
    sum += (n-i) * data[i]

print(sum)

 

저번에 풀었던 문제지만 삽입 정렬로 다시 풀었다. (정답)

 


04-4. 퀵 정렬

 

019. K번째 수 (백준 11004번)

 

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

 

from sys import stdin
import sys

sys.setrecursionlimit(10**8)

n, k = map(int, stdin.readline().split())
data = list(map(int, stdin.readline().split()))

def swap(i, j):
    global data
    temp = data[i]
    data[i] = data[j]
    data[j] = temp

def quickSort(s, e):
    global data

    if s >= e:
        return

    m = (s + e) // 2
    swap(s, m)
    pivot = data[s]
    i = s + 1
    j = e

    while i <= j:
        while i <= e and data[i] < pivot:
            i += 1
        while j >= s and data[j] > pivot:
            j -= 1
        if i < j:
            swap(i, j)
            i += 1
            j -= 1
    
    data[s] = data[j]
    data[j] = pivot

    quickSort(s, j-1)
    quickSort(j+1, e)

quickSort(0, n-1)
print(data[k-1])

 

퀵 정렬 구현이 그렇게 직관적이지는 않아서 이해하는 데에 꽤 오래 걸렸다 ㅠㅠ. 그렇게 겨우겨우 코드를 완성했는데,,!! 시간 초과..... (오답) 아마 퀵 정렬이 피벗값 선택에 따라 최악의 경우 시간 복잡도가 n^2 이라서 그런 것 같다. 그래서 결국 이 문제는 파이썬 내장 함수 sort()를 사용해서 풀었고(정답), 내가 작성한 퀵 정렬이 제대로 정렬되는지는 수 정렬하기 (백준 2750번) 문제에 제출해봄으로써 확인했다.

 


04-5. 병합 정렬

 

020. 수 정렬하기 2 (백준 2751번)

 

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

 

from sys import stdin

n = int(stdin.readline())
data = []
tmp = [0] * n
for i in range(n):
    data.append(int(stdin.readline()))

def mergeSort(s, e):
    if e - s < 1:
        return

    m = (s + e) // 2
    mergeSort(s, m)
    mergeSort(m+1, e)

    for i in range(s, e+1):
        tmp[i] = data[i]

    k = s
    index1 = s
    index2 = m+1

    while index1 <= m and index2 <= e:
        if tmp[index1] > tmp[index2]:
            data[k] = tmp[index2]
            index2 += 1
            k += 1
        else:
            data[k] = tmp[index1]
            index1 += 1
            k += 1
    
    while index1 <= m:
        data[k] = tmp[index1]
        index1 += 1
        k += 1
    while index2 <= e:
        data[k] = tmp[index2]
        index2 += 1
        k += 1

mergeSort(0, n-1)

for i in data:
    print(i)

 

이것도 풀었던 문제지만 병합 정렬로 다시 풀었다. (정답)

 


 

021. 버블 소트 (백준 1517번)

 

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

 

from sys import stdin

n = int(stdin.readline())
data = list(map(int, stdin.readline().split()))
tmp = [0] * n
result = 0

def mergeSort(s, e):
    global result

    if e - s < 1:
        return

    m = (s + e) // 2
    mergeSort(s, m)
    mergeSort(m+1, e)

    for i in range(s, e+1):
        tmp[i] = data[i]

    k = s
    index1 = s
    index2 = m+1

    while index1 <= m and index2 <= e:
        if tmp[index1] > tmp[index2]:
            data[k] = tmp[index2]
            index2 += 1
            k += 1
            result += m - index1 + 1
        else:
            data[k] = tmp[index1]
            index1 += 1
            k += 1
    
    while index1 <= m:
        data[k] = tmp[index1]
        index1 += 1
        k += 1
    while index2 <= e:
        data[k] = tmp[index2]
        index2 += 1
        k += 1

mergeSort(0, n-1)

print(result)

 

플래티넘 문제라서 쫄았는데, 병합 정렬을 사용하는 문제고 변화한 인덱스만큼 swap이 일어났다는 아이디어만 떠올리면 그 후는 간단한 문제였다. 물론 그 아이디어는 책이 떠올려줬다.. ^__^ 암튼 (정답).

 


04-6 기수 정렬

 

022. 수 정렬하기 3 (백준 10989번)

 

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

 

from sys import stdin

n = int(stdin.readline())
count = [0] * 10000

for i in range(0, n):
    num = int(stdin.readline())
    count[num-1] += 1

for i in range(0, 10000):
    for j in range(0, count[i]):
        print(i+1)

 

이것도 전에 풀었던 문제인데, 내 이전 풀이랑 책에 있는 풀이가 거의 완전 똑같아서 신기했다. (정답) 참고로 이 문제는 기수 정렬 아니고 계수 정렬!

 

'Group > EDOC' 카테고리의 다른 글

EDOC 2023-2 6주차 과제  (0) 2023.11.27
EDOC 2023-2 5주차 과제  (0) 2023.11.12
EDOC 2023-2 4회차 정모  (0) 2023.10.09
EDOC 2023-2 3주차 과제  (0) 2023.10.07
EDOC 2023-2 3회차 정모  (0) 2023.10.02
Comments