빅오는 입력값이 커질 때 알고리즘의 실행 시간(시간 복잡도)와 공간 요구사항(공간 복잡도)이 어떻게 증가하는지를 분류하는 데 사용하고, 알고리즘의 효율성을 분석하는데에도 활용됨.
'상한' '최악'
빅오(Big-0)는 입력값이 무한대로 행할 때 함수의 상한을 설명하는 수학적 표기방법
0(1) : 입력값이 아무리 커도 실행 시간은 일정. 제일 좋음
0(log n): 로그는 괜찮음....
0(n) : 일차함수 . 입력값만큼 실행 시간에 영향을 받고, 알고리즘을 수행하는데 걸리는 시간은 입력값에 비례한다. Linear-Time 알고리즘.
O(nlogn) :좋은 알고리즘.
O(n^2) : 버블정렬
매핑타입은 키와 자료형으로 구성된 복합 자료형, 딕셔너리같은거.
집합 : set -> 중복된 값을 가지지 않는다.
빈 집합은 a = set() -> a -> set()
a = { 1,2,3} 빈 집합이 아닌 집합을 선언할때 set은 입력 순서가 유지되지 않으며,
파이썬에서는 숫자 정수형으로 int만을 제공한다. bool은 논리 자료형인데 1(True)과 0(False)으로 처리되는 int의 서브 클래스이다. int는 object의 하위 클래스이기도 하다.
object -> int -> bool
문제1. 팰린드롬 : 팰린드롬은 앞뒤가 똑같은 단어나 문장으로
AsA 이런거... 대소문자 구분하지말고 영문자, 숫자만을 대상으로 해보자
주어진 문자열 s에서 영문자 또는 숫자면 strs에 추가해준다.
strs = [] #빈 리스트
for char in s:
if char.isalnum():
strs.append(char.lower())
팰린드롬 여부를 판단해보는 로직은, 처음꺼낸거랑 마지막에 꺼낸거랑 다르면 False을 반환 이를 모두 통과하면은 True을 리턴
While len(strs) > 1:
if strs.pop(0) != strs.pop():
return False
->
def isPalindrome(self, s:str) -> bool:
strs = []
for char in s:
if char.isalnum():
strs.append(char.lower())
while len(strs) > 1:
if strs.pop(0) != strs.pop():
return False
return True
슬라이싱 + 정규표현식을 사용
def isPalindrome(s):
s = s.lower()
s = re.sub('[^a-z0-9]','',s)
return s = s[::-1]
s[::-1] : 문자열 뒤집기 기억하자.
문제2. 문자열을 뒤집는 함수를 만들어보자. 입력값은 문자 배열
["h","e","l","l","o"] -> ["o","l","l","e","h"]
sol1) 포인터를 이용한스왑
from typing import List
class Solution:
def reverseString(self, s: List[str]) -> None:
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
문제4. 가장 흔한 단어 : 금지된 단어를 제외한 가장 흔하게 등장하는 단어츨 출력
입력값에 대한 전처리(preprocessing)작업이 필요함.
입력값에는 대소문자가 섞여있고, 쉼표 등 구두점이 존재한다.
->
words = [word for word in re.sub(r'[^\w]','',paragraph).lower().split() if word not in banned]
: 단어 문자가 아닌 문자를 공백으로 치환