Today's Plan
CS 개념 암기(1) OS
- 프로세스
코테
(1) 문자열, 정규식
(2) 완탐, 조합
(3) 부분집합
(4) 투포인터
(5) DP
(6) 힙큐
Simple Web Dev
(1) 강의 수강
(2) 정리 + 학습
CS 개념 암기
OS 프로세스
프로세스와 스레드의 차이는 무엇인가요?
교착상태란 무엇이며, 교착상태가 발생하기 위해서는 어떤 조건이 있어야 하나요?
교착상태의 해결법은 무엇인가요?
뮤텍스와 세마포어에 대해서 설명해 보시오.
컨텍스트 스위칭이란 무엇인가요?
경쟁 상태란 무엇인가요?
프로세스 혹은 스레드의 동기화란 무엇인가요?
사용자 수준의 스레드와 커널 수준의 스레드의 차이는 무엇인가요?
CPU 스케줄링이란 무엇인가요?
CPU 스케줄링 방법에는 대표적으로 어떤 것들이 있나요?
- 동기와 비동기, 블로킹과 넌블로킹의 차이는 무엇인가요?
Simple Web Dev
(1) 강의 수강
(2) 정리 + 학습
코테
(1) 문자열, 정규식
# 1. Palindrome : 앞뒤가 똑같은 단어나 문장, 대소문자구분하지 않음.
# 앞뒤가 같은 단어를 찾아라. 회문인 것을 찾아라. Palindrome.__doc__
def isPalindrome(str):
for i in range(len(str)//2):
if str[i] == str[-i-1]:
continue
else:
return 'not palindrome'
return 'palindrome'
print(isPalindrome('Madam, I\'m Adam'))
# 문장에 대소문자나 특수기호 있다면 제거하는 전처리 과정 진행 후에 판별한다.
# 전처리 1. isalnum(), lower() 사용
# isalnum : 알파벳 or 숫자
# 아래 풀이는 append, pop 많이 써서 속도 엄청 느려짐.
def isPalindrome(str):
# 전처리
list_str = []
for char in str:
if char.isalnum():
print(char)
list_str.append(char.lower())
# 회문 판별
while len(list_str) > 1:
if list_str.pop(0) != list_str.pop():
return 'not 팰린드롬'
return 'yes 팰린드롬'
print(isPalindrome('0Madam, I\'m Adam0'))
# 2단계: 슬라이싱 : [::-1]은 문자를 전체적으로 뒤집어준다.
s = ['가나다다나가']
if s == s[::-1]:
print('팰린드롬 맞다')
# +a 대소문자와 특수기호, 띄어쓰기 제거 등등 하는 전처리과정은 정규식(re) 사용해 진행.
import re
def inPalindrome(str):
# 대문자를 소문자로 변경
str = str.lower()
# 정규식 사용
str = re.sub('[^a-z0-9]', '', str)
print('전처리 거친 후', str)
if str == str[::-1]:
return '팰린드롬임'
else:
return '팰린드롬아님'
print(inPalindrome('0Madam, I\'m Adam0'))
# 정규식 코드 : re.sub('패턴', '바꿀문자열', '적용할 문자열'), ^는 NOT기능
# 3단계 : 파이썬에서 리스트에서 pop()을 이용해 맨 앞 글자 지우면 크기 클수록 오래 걸림
# 그래서 deque사용함.
import collections
def isPalindrome(str):
deq = collections.deque()
for char in str:
if char.isalnum():
deq.append(char.lower())
# 회문 판별
while len(deq) > 1:
if deq.popleft() != deq.pop():
return '회문'
return '회문'
print(isPalindrome('0Madam, I\'m Adam0'))
# 3 방법 중 슬라이싱이 시간 가장 적게 걸림
# 문자열 뒤집기
a = ['a', 'b', 'c', 'd', 'e']
print(a)
# 1. reverse 사용
a.reverse()
print(a)
# 2. 슬라이싱 사용
a = a[::-1]
print(a)
# 3. 투포인터 사용
# 처음과 끝은 인덱스를 변수로 지정한 후 변수를 +1이나 -1하여 인덱스를 이동시켜 조작하는 방식
# 포인터를 활용한 방식은 나중에 정렬을 배울 때도 유용하게 사용된다.
def reverseString(str):
left_idx, right_idx = 0, len(str)-1
while left_idx < right_idx:
str[left_idx], str[right_idx] = str[right_idx], str[left_idx]
left_idx += 1
right_idx -= 1
return str
a = reverseString(a)
print(a)
# 3. 조건에 맞게 재정렬
# 이 유형은 모르면 시간이 오래 걸리는 유형!! 잘 보자.
data = ['1 A', '2 B', '3 A', '4 D', '5 B']
# 1단계, 함수로 풀기. sort함수의 key인자.
def func(x):
return x.split()[1], x.split()[0]
data.sort(key=func)
print(data)
# 2단계, 1단계를 lambda로 짧게 표현하기
data.sort(key=lambda x: (x.split()[1], x.split()[0]))
print(data)
# 3단계. 위 방법들은 DB관리 측면에서 굉장히 많이 출력된다.
# 각각의 회원들의 댓글들 중에 숫자를 제거하고, 댓글들을 정렬한 후에 날짜순으로 재정렬하라.
# 이런 문제라면? sort의 key를 적용하며 str과 int를 분리해 적용시킨다.
def divide_sentence(list_datas):
print(list_datas)
str_l, int_l = [], []
list_datas = list_datas.split()[2:] # 아이디 첫 원소라 제거
print(list_datas)
for data in list_datas:
if data.isdigit():
str_l.append(data)
else:
int_l.append(data)
print(str_l, int_l)
divide_sentence("hanpy 20101213 재미없다 235 재미있다") # 회원 아이디, 가입날짜, 댓글들
# 유형 4. 특정 단어 추출
# 이 유형은 NLP에서도 자주 사용되는 스킬
paragraph = "Bob hit a ball, the hit BALL flew far after it was hit"
# "hit"을 제외한 단어 중 가장 많이 등장하는 단어를 뽑는 코드 작성, 대소문자 구분 x, 구두점 무시
# 1단계. 정규식 사용해서 불필요한 구두점 지우기
import re
# [^\w] 은 모든 문자와 숫자를 제외하고는 공백으로 바꾼다.
pragraph = re.sub('[^\w]', ' ', paragraph)
print(paragraph)
# 2단계. 정규식에 추가적으로 처리해보기
banned = 'hit'
word_list = re.sub('[^\w]', ' ', paragraph).lower().split()
words = [word for word in word_list if word not in banned]
print(words)
# 3단계. Counter() 함수르르 사용해서 빈도수를 계산하자. Counter는 자연어 처리에서 자주 쓰인다.
import collections
counts = collections.Counter(words)
print(counts) # Counter({'ball': 2, 'bob': 1, 'a': 1, 'the': 1, 'flew': 1, 'far': 1, 'after': 1, 'was': 1})
print(counts.most_common()) # [('ball', 2), ('bob', 1), ('a', 1), ('the', 1), ('flew', 1), ('far', 1), ('after', 1), ('was', 1)]
# Counter()에 대한 정리: Counter객체는 아이템에 대한 개수를 딕셔너리로 리턴해준다. 개수를 자동으로 계산해주기 때문에 매우 편리하다.
# most_common()을 사용하면 빈도수가 가장 높은 요소 출력 가능. 매개변수로 숫자 줘서 개수만큼 뽑아오기도 가능
# 유형 5. 애너그램(anagrmas)
# 에너그램이란 문자를 재배열하여 다른 뜻을 가진 단어로 바꾸는 것을 말한다. 입력값을 넣었을 때,
# 알파벳 순서를 바꾸면 같은 값이 되는 것들끼리 묶어서 출력되는 알고리즘을 작성해보자.
# 출력 값에서 그룹의 순서는 정답에 영향을 끼치지 않는다.
# 입력값 : ["eat","tea","tan","ate","nat","bat"]
# 출력값 : [["bat"],["nat","tan"],["ate","eat","tea"]]
# 풀이방법 : 간단 ! 각각의 단어들을 sorted()한 값들을 비교하여 같은 단어끼리 묶어주면 된다.
import collections
data = ["eat", "tea", "tan", "ate", "nat", "bat"]
# defaultdict :
sort_data = collections.defaultdict(list)
for word in data:
sort_data[''.join(sorted(word))].append(word)
print(sort_data.values())
# 가장 긴 팰린드롬 찾기
# 주어진 문자열에 존재하는 많은 팰린드롬 중에서 가장 긴 팰린드롬 찾기
def palindrome(n, left, right):
while right <= len(data) and left >= 0 and data[left] == data[right-1]:
right += 1
left -= 1
return data[left + 1 : right - 1]
data = 'ewqpbewqbfjabcdefedcbaienqnfkndkl'
res = ''
if data == data[::-1] or len(data) < 2:
print(data)
else:
for i in range(len(data)-1):
res = max(res, palindrome(len(data), i, i+1), palindrome(len(data), i, i+2), key=len)
(2) 완탐, 조합
# 순열 | nCr : n개의 수 중에서 r개를 뽑아 나열하는 경우의 수, 같은 숫자 있어도 순서 다르면 다른 경우
input_list = [1, 2, 3, 4, 5]
used = [0] * len(input_list)
print(used)
def perm(arr, n):
if n == len(input_list):
print(arr)
return
for i in range(len(input_list)):
if not used[i]:
used[i] = 1
arr.append(input_list[i])
perm(arr, n+1)
arr.pop()
used[i] = 0
perm([],0)
# 조합 : 리스트에서 뽑을 수 있는 모든 경우의 수
nums = [1, 2, 3, 4, 5]
answer_list = []
def combi(n, ans):
if n == len(nums):
temp = [i for i in ans]
answer_list.append(temp)
return
ans.append(nums[n])
combi(n + 1, ans)
ans.pop()
combi(n + 1, ans)
combi(0, [])
print(answer_list)
(3) 부분집합
(4) 투포인터
(5) DP
(6) 힙큐
Simple Web Dev
(1) 강의 수강
(2) 정리 + 학습
'Intro > Daily Study Note' 카테고리의 다른 글
[221110] Daily Study Note (0) | 2022.11.10 |
---|---|
[221109] Daily Study Note (0) | 2022.11.09 |
[220818] Daily Study Note (0) | 2022.08.18 |
[220816] Daily Study Note (0) | 2022.08.16 |
[220815] Daily Study Note (0) | 2022.08.15 |