본문 바로가기

Intro/Daily Study Note

[221108] Daily Study Note

 

 

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