명재를 재귀적으로 증명하는 방법
=>재귀호출 알고리즘 끝까지 제대로 되나 들여다 볼 필요 없음, 처음이랑 그 다음만 되면 그 뒤로는 쭉 된다고 보자!!
#오름차순 정렬
def quickSort(array):
if len(array) <= 1: #array 요소가 하나인 경우(=정렬완료, 기저조건)
return array #정렬완료된 array 반환
pivot = array[0] #첫번째 원소를 pivot으로 설정
left = getSmall(array[1: ], pivot) #첫번째 원소를 뺀 배열과 첫번째 원소(=pivot)을 넘김
right = getLarge(array[1: ], pivot)
return quickSort(left) + [pivot] + quickSort(right) #좌/우의 정렬된 리스트와 가운데 pivot값을 합쳐 리턴
def getSmall(array, pivot) : #array에서 pivot보다 작은 값을 리스트로 반환
data = []
for a in array :
if a <= pivot :
data.append(a)
return data
def getLarge(array, pivot) : #array에서 pivot보다 큰 값을 리스트로 반환
data = []
for a in array :
if a > pivot :
data.append(a)
return data
#짝 맞는 괄호인지 판단하기
def checkParen(p):
#1. 기저조건 처리
#2. p에서 인접한 괄호쌍을 찾아 제거
#3. 재귀호출에서 괄호쌍 끝까지 제거해 나가기
if len(p) == 0 : #문자열 길이가 0이면 yes
return "YES"
elif len(p) == 1 : #1이면 (이나 )만 있는거니까 no
return "NO"
for i in range(len(p)-1) : #쌍이 맞으면 마지막은 )일거니까 (마지막-1)번째까지 (를 확인하기
if p[i] == '(' and p[i+1] == ')' :
q = p[:i] + p[i+2:] #p[i]랑 p[i+1]을 뺀 나머지로 배열을 다시 만들기
return checkParen(q)
return "NO" #문자열에 2개 이상 있는데 제거가 안된다면 쌍이 안맞는 괄호
- 문제를 정확히 이해한다
- 문제를 해결하는 알고리즘을 개발한다
- 알고리즘이 문제를 해결한다는 것을 증명한다
- 알고리즘이 제한시간 내에 동작한다는 것을 보인다
- 알고리즘을 코드로 작성한다
=>디버깅 하면 안됨!! 디버깅 필요 없게 2~4번을 잘 하기
ex. O(n), O(n^2)...