관리자

maketrans()

translate()

 

maketrans(s1,s2,s3):

s1[i]를 s2[i]로 replace & s3 제거

 

table = maketrans(s1,s2,s3)

str.translate(table)

str을 table대로 변환

 

# a->x, b->y, c->z로 replace.
# k는 delete
# 하는 mapping을 만든다

s = "xkplky"
table = s.maketrans('abc', 'xyz', 'k')
s.translate(table)
# "aplb"
# translation table from dictionary
# a->'', c->z
translation = {97: None, 99: 122}

s = "abcdef"

# translate string
s.translate(translation)
#bzdef

'언어 > python cheatsheet' 카테고리의 다른 글

이상한 swap  (0) 2019.10.23
remove key from dictionary if exists, else return None  (0) 2019.10.23
dictionary comprehension  (0) 2019.10.22
zip()  (0) 2019.10.22
원소 수세기 : Counter  (0) 2019.10.08

1. 1개의 배열로 3개의 스택

index가 나머지가 0,1,2

 

2. 최솟값을 반환하는 min 연산 추가

push, pop, min 은 O(1)

 

스택 하나 더 선언(M)

def push(x):
	if x<S.top():
    	M.append(x)
    else:
    	M.append(S.top())
    S.append(x)
    
    
def pop():
	if len(S) > 0:
      x = S.pop()
      M.pop()
      return x
    
def min():
	if len(M) > 0:
      return M[-1]

 

3. 일정 용량을 초과하는 경우 새로운 스택 생성

class stackList():
	def __init__(lim):
    	self.stacks = [[]]
        self.stacknum = 0
        self.limit = lim
        
    def push(x):
    	if len(self.stacks[-1]) > self.limit :
        	self.stacks.append([])
            self.stacknum += 1
    	
        self.stacks[-1].append(x)

	def pop():
        if len(self.stacks[-1]) > 0:
        	x = self.stacks[-1].pop()
        if self.stacks[-1] == 0:
        	self.stacks.pop()
          	self.stacknum -= 1
        return x


SetOfStack = stackList(M)

 

4. stack 2개로 큐 하나 구현

class Q:
	def __init__():
    	self.S1 = []
        self.S2 = []
        
    def push(x):
    	self.S1.append(x)
        
    def pop():
    	for i in range(len(S1)-1):
        	self.S2.append(self.S1.pop())
        x = S1.pop()
        for j in range(len(S2)):
        	self.S1.apppend(self.S2.pop())
        return x

 

5. 스택 정렬

def getMax(S, sorted):
	if not S: return sorted
    M = 0
	for i in range(len(S)):
    	x = S.pop()
    	if M < x:
        	M = x
            sorted.append(x)
        else:
        	S.append(x)
	getMax(S, sorted)

 

6. cat and dog queue

큐 2개 이용

큐에 넣을 때 들어온 시간도 같이 저장.

'Cracking the Coding Interview' 카테고리의 다른 글

1. 배열과 문자열  (0) 2019.10.09

인터럽트(interrupt)

 

인터럽트 벡터(interrupt vector)


인터럽트의 종류에 따라 handler 코드를 가리키는 포인터를 가진 자료구조.
인터럽트 종류마다 번호가 정해져있다.


인터럽트 번호
- linux
0 ~ 31 : 예외상황
32 ~ 47 : 하드웨어 인터럽트
128 : 시스템콜

- BIOS
0 ~ 7 : 예외상황
8 ~ 19 : 하드웨어 인터럽트
10, 13 ... : 시스템 콜

linux와 BIOS의 인터럽트 번호 중 겹치는 번호가 존재한다.
리눅스는 로딩이 되면 BIOS의 인터럽트 번호를 제거하고 linux의 인터럽트 번호를 설정한다.


인터럽트 핸들링(interrupt handling)

인터럽트가 발생했을 때 처리하는 것.
커널의 코드를 수행하는 것이므로 커널의 스택을 이용한다.
n개의 프로그램 -> n개의 독립 공간 존재

( 참고 )
스택 : 다른 함수를 호출했을 때, 돌아가야할 주소를 저장하는 자료구조 
데이터 : 전역 변수 등 프로그램이 사용하는 각종 데이터가 저장되는 곳 
코드 : 프로그래머가 작성한 코드가 기계어 형태로 저장되는 곳 


처리 과정

1) 현재까지 수행한 것을 PCB(Proces Control Block)에 저장한다.
2) 인터럽트 처리 루틴으로 와서 커널 코드 수행 
3) 인터럽트가 발생한 지점으로 돌아감 

* 인터럽트 중 인터럽트 발생은 허용되지 않는다.
하지만 우선순위가 높은 인터럽트가 발생하는 경우
커널 스택에 저장하고 우선 순위가 높은 것부터 처리 


인터럽트의 종류

1) 하드웨어 인터럽트(hardware interrupt) : 하드웨어 장치가 CPU에게 서비스를 받아야하는 경우 
2) 소프트웨어 인터럽트(software interrupt) :  예외 처리(메모리 침범, 0으로 나누는 연산 등), 시스템 콜 


입출력 처리 방법

1) 동기
- 입출력이 완료된 다음에 CPU를 다른 프로그램에 양도하는 방식 
- 비효율적이다
- 다른 프로그램에 양도하는 경우, 장치별로 큐를 두어 다수의 입출력 연산을 순서대로 처리하도록 한다.

2) 비동기 
입출력 연산을 요청한 뒤, CPU 제어권이 연산을 호출한 프로그램에 부여하는 방식 


DMA(Direct Memory Access): 

CPU이외에 메모리 접근이 가능한 장치
일종의 컨트롤러 
원래는 주변 장치들이 메모리에 접근하기 위해서는 CPU에 인터럽트를 발생시켜 CPU가 로컬 버퍼와 메모리 사이에서 데이터를 옮겨준다.
비효율적 
주변 장치들에 의해 자주 인터럽트 되는 것을 방지 
바이트 대신 블록 단위로 메모리를 읽은 뒤 CPU에 인터럽트. 
인터럽트의 빈도를 줄임. 


메모리 

1) 주기억 장치 
메모리 휘발성, RAM 

2) 보조기억 장치 
비휘발성 
- 파일 시스템용 
- 메모리의 연장 공간인 스왑 영역(swap area) 
프로그램 중 지금 사용하지 않는 부분을 저장하는 것 
swap out : 디스크에 내려 놓는 일 
하드 디스크가 주로 이용됨 

 


하드웨어 보안 

모드비트(mode bit) : 사용자 프로그램이 커널 모드에서만 사용할 수 있는 연산을 하는 것을 방지하기 위한 감시 장치 
CPU는 보안 관련 명령 이전에 항상 모드 비트를 확인. 
사용자 프로그램에 CPU의 제어권을 넘길 때는 1로 세팅 
인터럽트 발생시 다시 0으로 리셋됨. 


3.10 메모리 보안 

접근하는 메모리 영역이 합법적인가 확인하는 두 개의 레지스터 
1) 기준 레지스터 : 가장 작은 주소 
2) 한계 레지스터 : 범위 
사용자 모드에서는 두 레지스터를 이용하여 주소 범위 체크 
커널 모드에서는 무제한 접근 

3.11  CPU 보호

한 프로그램의 독점을 막기 위해 타이머(timer) - 하드웨어 사용 
정해진 시간이 지나면 인터럽트 발생 -> 운영체제에 CPU 제어권 넘김 
1씩 감소해서 0이 되면 timeout


참고 : https://rusy.tistory.com/entry/인터럽트interrupt

'CS 기본 이론 > OS' 카테고리의 다른 글

6.4 CPU 스케줄링  (0) 2019.10.31
5장 프로세스  (0) 2019.10.26
4장 인터럽트 원리  (0) 2019.10.24
개요  (0) 2019.10.08
1. 운영체제의 정의  (0) 2019.10.08

1. Hash Table

탐색

worst case : O(n)

average : O(1)

 

2. 가변 크기 배열

원소 삽입 : O(1)

크기를 두 배로 늘리는 시간 : O(n)

 

3. 문자열

이어붙이기 :  O(n**2)

 

면접 문제

1.1 문자열에 같은 문자가 중복되어 등장하는가?

ans:

해시 테이블을 만들어서, 문자열을 순회한다.

문자열을 키로 가지도록 한다. 이미 존재하는 키인 경우 동일한 문자열이 존재한다.

시간 복잡도 : O(n) - 한번 순회하면 끝남 * 삽입과 탐색은 O(1)

공간 복잡도 : O(n)

 

1.1-1) 추가 자료 구조를 사용하지 않으려면?

for (i=0;i<s.length()-1;i++){
	for(j=i+1;j<s.length();j++){
    	if s[i] == s[j] :
        return True
        }
    }
 return False

시간 복잡도 : O(n**2)

공간 복잡도 : X

 

1.2 두 문자열이 서로 순열 관계인지 확인하는 메서드

s1.sort()
s2.sort()

return s1 == s2

시간 복잡도 : 정렬 방식에 의해 결정

공간 복잡도 : X

 

2) hash table을 만들어서 각 문자열의 출현 빈도를 세서 비교한다.

 

1.3

모든 공백을 %20으로 바꾸어주는 메서드

s.replace(' ', '%20)
import re
pat = re.compile(' ')
re.sub(pat, '%20', s)

 

1.4

회문 순열

주어진 문자열이 회문의 순열인지 확인하는 함수

문자열을 순회하면서 각 문자를 키로 갖는 Hash Table을 만든다.

모든 문자가 짝수개 존재하거나, 하나만 홀수개 존재하고 나머지는 짝수개 존재해야한다.

 

1.5

문자 삽입/삭제/교체를 한 번 이내 수행해서 같은 문자열로 만들 수 있는지 확인하는 함수

if len(s1)==len(s2):
	flag = False
	for i in range(len(s1)):
    	if flag : return False
		if s1[i] != s2[i]:
        	flag = True
    return True
    
    
elif len(s1) < len(s2):
	j=0
    flag = False
    for i in range(len(s1)):
    	if s1[i] != s2[j]:
        	if flag : return False
        	j += 1
            flag = True
    return True
    
else:
	i=0
    flag = False
    for j in range(len(s2)):
    	if s1[i] != s2[j]:
        	if flag : return False
        	i += 1
            flag = True
    return True

 

1.6 문자열을 압축하자

aabcccaaa -> a2b1c5a3

만약 압축된 문자열이 더 길다면 기존 문자열을 반환하자

pre = None
zipped = []
c = 0
for i in range(len(s)):
	if s[i] == pre:
    	c += 1
    else:
    	zipped.append(pre + str(c))
    	pre = s[i]
zipped = ''.join(zipped)

if len(zipped) > len(s): return s
return zipped

 

1.7 행렬을 90도 회전시키는 메소드

행렬을 추가로 사용하지 않고도 가능한가?

temp = M[i][j]
W = len(M[0])
H = len(M)

for i in range(len(M)//2):
	for j in range(i,len(M[0])//2-i):
    	temp = M[i][j]
        for k in range(4):
            M[i][j] = M[j][W-1-i]

 

1.8 0 행렬

m x n행렬의 한 원소가 0일 때, 해당 원소가 속한 행과 열의 모든 원소를 0으로 설정하는 알고리즘

 

 

1.9

s2를 두 번 이어붙이고, s1이 s2를 이어붙인 문자열의 substring인지 확인한다

'Cracking the Coding Interview' 카테고리의 다른 글

3. Stack/Queue  (0) 2019.10.16

1. CPU 관리

1) FCFS(First Come First Serve)

 

2) 라운드 로빈(Round Robin):

   한 번에 고정된 시간을 할당하여 처리.

   짧은 프로그램이 기다릴 필요 X

 

3) 우선순위(priority)

 

2. 메모리 관리

효율적인 할당 및 보안(메모리 영역 침범 방지)

1) 고정 분할(fixed partition)

   물리적 메모리를 몇 개의 영구 메모리로 분할.

   메모리 조각보다 큰 프로그램 적재 X

  내부 조각(internal fragmentation) : 분할의 크기보다 작은 프로그램이 적재되는 경우

 

2) 가변 분할(variable partition)

    메모리 조각보다 큰 프로그램 적재 X

    내부 조각 발생 X

   외부 조각(external fragmentation) : 크기가 작아 프로그램에 할당될 수 없는 영역

 

3) 가상 메모리(virtual memory)

물리 메모리보다 큰 프로그램 실행 가능

0에서 시작하는 가상 메모리 주소를 물리 메모리 주소로 mapping.

   스왑 영역(swap area) : 프로그램 실행시 프로그램 전체가 필요한 것이 아니므로, 필요한 일부만 메모리에 적재.

나머지는 하드디스크와 같은 보조 기억 장치에 적재. 

   페이징(paging) : 동일한 단위로 메모리를 나누는 기법

 

3. 주변 장치 및 입출력 장치 관리

   인터럽트(interrupt) : CPU의 서비스가 필요한 경우 CPU에게 보내는 신호

   인터럽트 처리 루틴 : 인터럽트 발생시 처리 작업을 정의한 코드

   컨트롤러(controller) : 주변 장치에 존재하는 작은 CPU.

                                  장치 관리 및 메인 CPU에 인터럽트 발생

 

'CS 기본 이론 > OS' 카테고리의 다른 글

6.4 CPU 스케줄링  (0) 2019.10.31
5장 프로세스  (0) 2019.10.26
4장 인터럽트 원리  (0) 2019.10.24
3장 컴퓨터 시스템의 동작 원리  (0) 2019.10.10
1. 운영체제의 정의  (0) 2019.10.08

+ Recent posts