본문 바로가기

IT To do and To was

22년 11월 30일_11월의 마지막 날, SQL, 이것이(정렬), 알고리즘PYTHON

728x90
반응형

수요일[아 내일 12월이네ㅜㅠ]

 

1. w3big

2. SQL

3. 이것이

4. 알고리즘

 

1>

w3big 잘 되어있으나 한글로 번역이 되어있지 않아서 살짝 아쉽다.

 

2>

와 C 드디어 풀었다

식품분류별 가장 비싼 식품의 정보 조회하기

SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME FROM
(SELECT CATEGORY AS CA, MAX(PRICE) AS MP, PRODUCT_NAME AS PRO FROM FOOD_PRODUCT
GROUP BY CA)A
INNER JOIN (SELECT * FROM FOOD_PRODUCT)B
ON A.MP = B.PRICE AND CATEGORY = B.CATEGORY
WHERE CATEGORY = "과자" OR CATEGORY = "김치" OR CATEGORY = "식용유" OR CATEGORY = "국"
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC

 

3>

정렬(선택정렬, 삽입정렬, 퀵정렬, 계수정렬.. 등)

선택 정렬 : 매번 가장 작은 걸 선택하여 맨 앞에 있는 데이터와 바꾸고 그 STEP을 반복한다.

 

선택정렬 소스 코드

array =[1,3,5,2,3,6,7,5,0]

for i in range(len(array))
	min_index = i
    for j in range(i+1, len(array)):
    	if array[min_index] > array[j]:
        	min_index = j
    array[i], array[min_index] : array[min_index], array[i] #스와프

 

삽입정렬 : 두번재 데이터부터 시작하여 사잇값을 뒷 데이터와 비교 후 삽입

 

삽입정렬 소스 코드

array = [1,4,8,3,5,9,0]

for i in range(1, lend(array)):
	for j in range(i, 0, -1):
    	if array[j] < array[j - 1]:
        	array[j], array[j  - 1] = array[j - 1], array[j]
        else : # 자기보다 작은 데이터를 만나면 그 위치에서 멈춤
        	break

퀵정렬 : 기준데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 것 pivot을 이용 큰수와 작은 수를 교환할 때의 기준을 피벗

- 호어분할(Hoare Partition)

리스트에서 첫 번째 데이터를 피벗으로 정함

왼쪽부터 피벗보다 큰 데이터를 찾고 오른족은 작은 데이터를 찾는다

그 후 서로 교환하여 중간 값까지 교환 후 중간에 피벗을 넣고 좌 우도 동일한 과정을 거친다.

 

퀵정렬 소스 코드

array = [1,5,8,9,7,4,3]

def quick_sort(array, start, end):
	if start >= end : # 원소가 1개이면 종료
    	return 
    pivot = start # pivot은 첫번째 원소
    left = start +1
    right = end
    while left <= right :
    	# 피벗보다 큰 데이터 찾음
    	while left <= end and array[left] <= array[pivot]:
        	left += 1
        # 피벗보다 작은 데이터 찾음
        while right > start and array[right] >= array[pivot]:
        	right -= 1
        if left > right :
        	array[right], array[right] = array[right], array[left]
    quick_sort(array, start, right-1)
    quick_sort(array, right +1, end)
    
quick_sort(array, 0, len(array)-1)

python 장점을 살린 퀵 정렬 소스코드

array = [5,7,9,0,3,1,6,2]

def quick_sort(array):
	# 리스트가 하나 이하의 원소만을 담고 있다면 종료
    if len(array) <= 1:
    	retrun array
    pivot = array[0] # 피벗은 첫 번째 원소
    tail = array[1:]
    
    left_side = [x for x in tail if x <= pivot] # 분할된 왼쪽
    right_side = [ x for x in tail if x > pivot] # 분할된 오른쪽
    
    # 분할 이후 왼족 부분과 오른쪽 부분에서 각각 정렬을 수행하고, 전체 리스트를 반환
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

퀵 정렬의 평균 시간 보잡도는 O(NlogN)

 

계수정렬 : 특징으로 매우 빠름. 일반적으로 별도의 리스트를 선언하고 그 안에 정렬에 대한 정보를 담는다.

데이터를 1씩 증가시키면서 계수를 정렬시킨다.

각 데이터가 몇번 등장했는지 알 수 있음

그 후 새로 만든 데이터의 값과 노출된 횟수를 차례로 print한다

 

계수정렬 소스 코드

array = [7,5,9,0,3,1,6,2,9,1,4,8]
count = [0] * (max(array) +1) # 모든 범위를 포함하는 리스트 선언(0으로 초기화)
for i in range(len(array)):
	count[array[i]] += 1 # 각 데이터에 해당하는 인덱스의 값 증가
for i in range(len(count)):
	for j in range(count[i]):
    	print(i, end=' ')

어떤사람이 되고싶은가? 평온한사람

 

정렬 라이브러리

- sorted() 퀵 정렬과 동작 방식이 비슷하고 느리지만  O(NlogN)은 보장

 sort()와 sorted()는 key 매개변수를 입력받을 수 있다.key 값으로는 하나의 함수가 들어가야하며 이는 정렬 기준이 된다.

 

test= [('바나나',2),('사과', 5),('파인애플',3)]

def setting(data):
	return data[1]
sorted(test, key=setting)

 

데이터의 범위가 한정되어있으며, 더 빠르게 동작해야할때는 계수정렬을 사용

 

위에서 아래로

a = int(input())
c = []
for i in range(a):
    b = int(input())
    c.append(b)
c.reverse()
for i in range(len(c)):
    print(c[i], end=' ')

답안 :

n = int(input())

array = []
for i in range(n):
	array.append(int(input())
    
array = sorted(array, reverse=True)

for i in array:
	print(i, end=' ')

 

이 다음 문제는 이해가 안돼서 내일..

4>

주사위 개수

def solution(box, n):
    return (box[0] // n) * (box[1] //n) * (box[2]//n)

다른사람이 한 풀이

def solution(box, n):
    w,h,d = box[0]//n,box[1]//n,box[2]//n 
    return w*d*h

내가 생각한 다른 풀이(런타임 에러떠서 제출 못함)

import math
def solution(box,n):
	return math.prod(box[i]//n for i in range(n))

 

문자열 내 p와 y의 개수

def solution(s):
    answer = True
    s = s.lower()
    a, b = 0, 0
    for i in s:
        if i == "y":
            a += 1
        elif i == "p":
            b += 1
        else:
            continue
        
    if a == b :
        pass
    else:
        answer = False
    
    return answer

다른사람이 한 풀이

# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def numPY(s):
    # 함수를 완성하세요
    return s.lower().count('p') == s.lower().count('y')

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( numPY("pPoooyY") )
print( numPY("Pyy") )

.count 사용 

 

n월 (진척도)

알고리즘 공부 6%

SQL 85%

정보처리기사 0%

토스 1%

9월 10월에 좀 할걸... 또르르

// yesterday wished to today list.

. https://www.w3big.com/ko/python/default.html#gsc.tab=0 보기_✔️

. SQL 못푼 거 하나라도 풀기(1/4)_✔️

. 이것이_✔️

. 하나 넣기_✔️

. 월계획 쓰기_✔️

 

tomorrow wish list

. 병원 잘 다녀오기

. 못푼 SQL 하나라도 풀기

. 11시부터 5시까지 딴짓 하지 않기

. 알고리즘 

728x90
반응형