LIS 알고리즘

  • 최장 증가 부분 수열
  • 일반적으로 DP(동적 계획법)으로 푸는 알고리즘
  • 임의의 수열이 주어질 때, 이 숭려에서 몇 개의 수들을 제거해서 부분 수열을 만든다.
  • 이 때 부분수열들을 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열이라고 한다.

 

예시 코드

  • 아래의 배열이 주어졌을 때
arr = [3,5,7,9,2,1,4,8]

 

  • 아래처럼 부분 수열을 만들 수 있다.
  • 이 중에 3,5,7,8이 LIS
arr = [3,7,9,1,4,8]
arr = [7,9,1,8]
arr = [3,5,7,8]
arr = [1,4,8]

 

일반적인 DP 풀이 방법 - O(n^2)

dp = [1]*n
for i in range(n):
	for j in range(i):
    	if arr[i] > arr[j]:
    		dp[i] = max(dp[i], dp[j]+1)

 

이분 탐색 이용 - O(nlogn)

# 수열 A가 주어질 때, 가장 긴 증가하는 부분 수열 구하기
n = 6
arr = [10,20,10,30,20,50]
lis = [0]

for case in arr:
    if lis[-1] < case:
        lis.append(case)
    else:
        left = 0
        right = len(lis)

        while left < right:
            mid = (left+right)//2
            if lis[mid] < case:
                left = mid + 1
            else:
                right = mid
        lis[right] = case
print(lis[1:])

 

 

백준 풀이 코드

https://hhiyeon.tistory.com/168

 

[백준] 11053번 가장 긴 증가하는 부분수열 - dp, LIS

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20,..

hhiyeon.tistory.com

 

https://hhiyeon.tistory.com/166

 

[백준] 12015번 가장 긴 증가하는 부분수열2 - 이분탐색, LIS

https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1..

hhiyeon.tistory.com

 

완전탐색

- 모든 경우의 수를 계산하는 방법

 

백트래킹

- 주어진 문제에서 답을 구하기 위해 가능한 경우의 수를 탐색하는 방법

- 해를 찾는 도중에 찾는 해가 아닌 경우 되돌아가서 해를 찾는다.

 

백트래킹 문제 

1. N과 M(1) 15649번

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

n, m = 4, 2
#n, m = map(int, input().split())
s = [] # 수열을 저장하는 리스트

def dfs():
    if len(s) == m: # 리스트의 길이가 m개인 경우
        print(' '.join(map(str, s))) # 리스트의 모든 숫자들을 출력
        return 
    for i in range(1, n+1): # 1부터 n+1
        if i not in s: # 리스트 안에 i(1~4) 가 없으면 
            s.append(i) # 리스트에 i(1~4) 추가
            dfs() # 다음 레벨
            s.pop() # 마지막으로 넣었던 i 제거
dfs()



n, m = 4,2
stack = []

def dfs(start):
    if len(stack) == m:
        # print(stack)
        print(' '.join(map(str, stack)))
        return 
    for x in range(1, n+1):
        if x not in stack:
            stack.append(x)
            dfs(start+1)
            stack.pop()
dfs(1)

 


3. N과 M(3) 15650번

https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

n, m = map(int, input().split())
stack = []

def dfs(start):
    if len(stack) == m:
        print(' '.join(map(str, stack)))
        return
    else:
        for x in range(start, n+1):
            if x not in stack:
                stack.append(x)
                #print(stack)
                dfs(x+1)
                stack.pop()
dfs(1)

 


3. N과 M(3) 15651번

 

https://www.acmicpc.net/problem/15651

 

15651번: N과 M (3)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

# n, m = map(int, input().split())
n, m = 4,2 
stack = []

def dfs():
    if m == len(stack):
        print(' '.join(map(str, stack)))
        return
    for x in range(1, n+1):
        stack.append(x)
        dfs()
        stack.pop()
dfs()

 


4. N과 M(4) 15652번

https://www.acmicpc.net/problem/15652

 

15652번: N과 M (4)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

#n, m = map(int, input().split())
s = [] 

def dfs(start):
    if len(s) == m: # 리스트의 길이가 m개인 경우
        print(' '.join(map(str, s))) # 리스트의 모든 숫자들을 출력
        return 
    for i in range(start, n+1): # start으로 1,1 2,2, 3,3
        s.append(i) # 리스트에 i(1~4) 추가
        dfs(i) # 다음 레벨
        s.pop() # 마지막으로 넣었던 i 제거
dfs(1)

 


5. N과 M(5) 15654번

https://www.acmicpc.net/problem/15654

 

15654번: N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

n, m = map(int, input().split())
# n, m = 4, 2 # n개의 수를 입력받고, m개의 중복없는 수열을 구하기
# arr = [9,8,7,1]
arr = list(map(int, input().split()))
arr = sorted(arr) # 사전순 출력
stack = []

def dfs():
    if len(stack) == m:
        for idx in stack:
            print(arr[idx], end=' ')
        print()
        return
    for x in range(0, n):
        if x not in stack:
            stack.append(x)
            dfs()
            stack.pop()
dfs()

 


6. N과 M(6) 15655번

https://www.acmicpc.net/problem/15655

 

15655번: N과 M (6)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

#n, m = map(int, input().split())
#arr = list(map(int, input().split()))
n, m = 4, 4
arr = [1231, 1232, 1233, 1234]
arr = sorted(arr)
stack = []

def dfs(start):
    if len(stack) == m:
        for idx in stack:
            print(arr[idx], end=' ')
        print()
        return
    for x in range(start, n):
        if x not in stack:
            stack.append(x)
            dfs(x+1)
            stack.pop()
dfs(0)

 

 


7. N과 M(7) 15656번

https://www.acmicpc.net/problem/15656

 

15656번: N과 M (7)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

n, m = map(int, input().split())
arr = list(map(int, input().split()))
#n, m = 4, 2
#arr = [9,8,7,1]
arr = sorted(arr) # 사전순 출력
stack = []

def dfs(start):
    if len(stack) == m:
        for idx in stack:
            print(arr[idx], end=' ')
        print()
        return

    for x in range(0, n):
        # 중복 상관 X
        stack.append(x)
        dfs(start+1)
        stack.pop()

dfs(0)

 


8. N과 M(8) 15657번

https://www.acmicpc.net/problem/15657

 

15657번: N과 M (8)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

#n, m = map(int, input().split())
#arr = list(map(int, input().split()))

n, m = 4, 2
arr = [9,8,7,1]
arr = sorted(arr)
stack = []

def dfs(start):
    if len(stack) == m:
        for idx in stack:
            print(arr[idx], end=' ')
        print()
        return
    
    for x in range(start, n):
        stack.append(x)
        dfs(x)
        stack.pop()
dfs(0)

 


9. N과 M(9) 

https://www.acmicpc.net/problem/15663

 

15663번: N과 M (9)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

#n, m = map(int, input().split())
#arr = list(map(int, input().split()))

n, m = 4, 2
arr = [9,7,9,1]
arr = sorted(arr)
visited = [False]*n # 사용한 원소 체크
stack = []
answer = []

def dfs(v):
    if len(stack) == m:
        answer.append(tuple(stack))
        return
    
    for x in range(0, n):
        if visited[x]:
            continue
        stack.append(arr[x])
        visited[x] = True # 사용
        dfs(v+1)
        visited[x] = False # 사용끝
        stack.pop() 
dfs(0)

# 오름차순, set 중복제거
for x in sorted(list(set(answer))):
    print(*x) # 튜플 출력

 


10. N과 M(10) 15664번

https://www.acmicpc.net/problem/15664

 

15664번: N과 M (10)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

n, m = map(int, input().split())
arr = list(map(int, input().split()))
#n, m = 4,2
#arr = [999,1,23,5]
#arr = [9,7,9,1]
arr = sorted(arr) # 오름차순
stack = []

def dfs(v):
    if len(stack) == m:
        print(stack)
        return

    prev = 0
    for x in range(v, n):
        if prev != arr[x]:
            stack.append(arr[x])
            prev = arr[x]
            dfs(x+1)
            stack.pop()
dfs(0)

 


11. N과 M(11) 15665번

https://www.acmicpc.net/problem/15665

 

15665번: N과 M (11)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

n, m = map(int, input().split())
arr = list(map(int, input().split()))
arr = sorted(arr)
stack = []

def dfs():
    if len(stack) == m:
        print(*stack)
        return
    prev = 0
    for x in range(0, n):
        if prev != arr[x]:
            stack.append(arr[x])
            prev = arr[x]
            dfs()
            stack.pop()
dfs()

12. N과 M(12) 15666번

https://www.acmicpc.net/problem/15666

 

15666번: N과 M (12)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

#n, m = map(int, input().split())
#arr = list(map(int, input().split()))
n, m = 4, 2
arr = [9,7,9,1]
arr = sorted(arr)
stack =[]

def dfs(v):
    if len(stack) == m:
        print(*stack)
        return
    prev = 0
    for x in range(v, n):
        if prev != arr[x]:
            stack.append(arr[x])
            prev = arr[x]
            dfs(x)
            stack.pop()
dfs(0)

 

6603번 로또

def dfs(stack, numbers, start, k):
    if len(stack) == 6:
        print(' '.join(map(str, stack)))
        return
    for x in range(start, len(numbers)):
        dfs(stack + [numbers[x]], numbers, x + 1, k)


while True:
    num = list(map(int, input().split()))
    if num[0] == 0:
        break

    k = num[0]  # 번호 개수
    numbers = sorted(num[1:])  # 번호 리스트

    visited = [False] * len(numbers)
    dfs([], numbers, 0, k)
    print()

 

1182번 부분수열의합

n, s = map(int, input().split())  # 정수의 개수, 정수 S
numbers = list(map(int, input().split()))

# n, s = 5, 0
# numbers = [-7, -3, -2, 5, 8]
cnt = 0


# 크기가 양수인 부분 수열 중에서 다 더한 값이 S인 경우의 수 구하기

def dfs(idx, cost):
    global cnt
    if idx >= n:  # 인덱스가 정수 개수보다 크면 종료
        return
    cost += numbers[idx]  # 더한값 += 현재 값
    if cost == s:  # 더한 값이 s면 경우의수 + 1
        cnt += 1
    dfs(idx + 1, cost)  # 현재 원소를 포함하는 경우
    dfs(idx + 1, cost - numbers[idx])  # 현재 원소를 포함하지 않는 경우


dfs(0, 0)
print(cnt)

 

9663번 N-Queen

def adjacent(x):
    for i in range(x):
        if row[x] == row[i] or abs(row[x] - row[i]) == x - i:
            return False
    return True


def dfs(x):
    global result

    if x == n:
        result += 1
        return
    for i in range(n):
        if visite[i]:
            continue
        row[x] = i
        if adjacent(x):
            visite[i] = True
            dfs(x + 1)
            visite[i] = False

import sys

# n = int(sys.stdin.readline())
n = 8  # n x n 크기의 체스판
row = [0] * n
visite = [False] * n
result = 0
dfs(0)
print(result)

MySQL Data Type

- 빈번한 데이터 변화에는 VAR(variable)보다 CHAR 사용 권장

 

MySQL 내장 함수

- 문자열 함수

(1) CHAR_LENGTH : 문자 수 계산

(2) LENGTH : 문자 byte 계산, 한글은 1글자에 3byte

(3) CONCAT : 문자열 연결

(4) CONCAT_WS : 문자열에 특정 문자 넣기

(5) FORMAT : 3자리씩 콤마를 찍어준다. -> 금액 표현

(6) TRIM : 문자열 앞 뒤 공백 제거

(7) REPLACE : 특정 문자열을 다른 문자열로 교체

(8) SUBSTRING : 지정 범위 문자열 출력

 

- 날짜 함수

(1) CURDATE() : 현재 연월일, YEAR(CURDATE()) 으로 연도만 사용할 수 있다.

(2) NOW() : 현재 연월일 및 시분초

SELECT CHAR_LENGTH('abcde'), -- 5 --
	CHAR_LENGTH('홍길동'), -- 3, 문자 수 계산 --
    LENGTH('abcde'), -- 5, byte 수 계산 --
    LENGTH('홍길동'); -- 9 --


SELECT CONCAT('소리없는', '아우성'), -- 문자열 연결 --
CONCAT_WS('-','2022','02','20'); -- 문자열에 끼워넣기 --

SELECT FORMAT(1234567.1415234,3); 
-- 소수점 3째자리,--


SELECT TRIM('		소리없는 아우성	'),
	REPLACE('이것은 소리없는 아우성','소리', '양심'),
    SUBSTRING('이것은 소리없는 아우성',3,5);

SELECT CURDATE(),
	NOW(),
	YEAR(CURDATE());

 

 

 

 

 

 

SQL

- DML(Data Manipulation Language) : Insert, select, update, delete

- DDL(Data Defination Language) : Create, Drop, Alter

- DCL(Data Control Language) : grant, deny

 

DML vs DDL

- Transaction의 사용 가능 유무

- DML Transaction 영향 O

- DDL Transaction 영향 X

 

Transaction(트랜잭션)

- 작업의 최소 단위

- 임의로 설정할 수 있는 개념이다.

- 여러 SQL 문장을 하나의 논리적인 단위인 Transaction으로 설정한다.

- 사용 이유 : Transaction 설정시 DBMS가 ACID 보장

- commit(반영) or rollback(무효화)

 

MySQL Workbench Auto Commit Transactions

- 워크벤치 기능에 쿼리를 할 때마다 자동적으로 트랜잭션해주는 모드가 켜져 있다.


ACID

(1) Atomicity(원자성)

- All or nothing

- 모든 작업이 완료되거나 실행이 아무것도 되지 않아야 한다.

 

(2) Consistency(일관성)
- 트랜잭션이 끝난 후, 결과가 제약조건에 위배 되지 않는 상태(correct state)이 된다.

 

(3) Isolation(독립성)

- 모든 트랜잭션이 다른 트랜잭션에 독립적이다.

- Thread 동기화 처리와 일치한다.

 

(4) Durability(지속성)

- 트랜잭션 종료 시, 해당 결과가 2차 저장소에 영구적으로 저장된다.

 

Ex. 이체 시스템

- A 계좌 SELECT (잔고 확인)

- A 계좌 UPDATE (잔고 수정)

- B 계좌 SELECT (입금 전 금액) 

- B 계좌 UPDATE (입금 후 금액)

 


 

JOIN

(1) INNER JOIN

- 일반적인 JOIN

 

(2) OUTER JOIN

- LEFT, RIGHT, FULL

- JOIN 조건을 만족하지 않는 행을 포함한다.


(3) SELFT JOIN

 

(4) CROSS JOIN

- 일반적으로 많이 사용하지 않는다.

- 더미데이터 생성에 사용

 


실습 SQL문 정리

-- 평균 구하기 --
SELECT AVG(칼럼명) FROM 테이블명;

-- 사용자별 평균 구매 금액 --
SELECT userID, AVG(칼럼명) FROM 테이블명
GROUP BY userID;

-- 가장 큰 키, 작은 키 회원의 이름과 키 출력 --
SELECT 이름, 키 FROM 테이블명
WHERE 키 = (
SELECT MAX(키 칼럼) FROM 테이블명
)
OR 키 = 
(
SELECT MIN(키 칼럼) FROM 테이블명
);

-- 사용자별 총 구매 금액 1000 이상 --
SELECT userID, SUM(구매금액*구매횟수) 
FROM 테이블명
GROUP BY userID
HAVING SUM(구매금액*횟수) >= 1000;


-- 트랜잭션 --
SELECT distinct userID FROM 테이블명;

START TRANSACTION -- 트랜젝션의 시작 구문 -- 

DELETE FROM 테이블명; -- 테이블 삭제 --
DELETE FROM 테이블명 WHERE 칼럼명 = '조건' LIMIT 100; -- 상위 100개만 지우기 --

COMMIT; -- 지금 작업한 내용 데이터베이스에 적용 -- 
ROLLBACK; -- 무효화 --

연습문제 SQL문 정리

-- FLOOR(AVG(SAL)) : 정수만 출력, 실수 값 버리기 --
SELECT JOB as '직무', FLOOR(AVG(SAL)) as '급여 평균' FROM EMP
WHERE DEPTNO=30
GROUP BY JOB;


-- 칼럼들의 누적 합계 구하기 -- 
-- FORMAT(금액, '0.000') : 금액 천단위마다 콤마 출력 --
SELECT JOB as '직무명', FORMAT(SUM(SAL), '0,000') as '급여의 합' FROM EMP
GROUP BY JOB
UNION ALL
SELECT 'TOTAL', FORMAT(SUM(SAL), '0,000') FROM EMP
ORDER BY '직무명';


-- CROSS JOIN : 2개 테이블 열 기준으로 붙이기 --
SELECT * FROM A CROSS JOIN B;


-- 1. IFNULL(칼럼명, 0) : NULL 처리 (NULL + 0이상의 값 = NULL이 출력된다) --
-- 2. FORMAT()으로 금액 천단위마다 콤마 + CONCAT()으로 금액 + '원' 출력
SELECT ENAME as '직원명', CONCAT(FORMAT(SAL+IFNULL(COMM, 0), '0,000'),'원') as '급여' FROM EMP
ORDER BY SAL+IFNULL(COMM, 0) DESC;


-- DATE_FROMAT() : DATE 타입 출력 형식 -- 
-- CASE WHEN ~ THEN : 조건별 표현식 --
SELECT ENAME as '직원명', DATE_FORMAT(HIREDATE, '%Y년 %m월 %d일') as '입사년월일',
   (CASE 
 	WHEN HIREDATE BETWEEN '1980-01-01' AND '1980-12-31' THEN 'A'
        WHEN HIREDATE BETWEEN '1981-01-01' AND '1981-12-31' THEN 'B'
        WHEN HIREDATE BETWEEN '1982-01-01' AND '1982-12-31' THEN 'C' 
        WHEN HIREDATE BETWEEN '1983-01-01' AND '1983-12-31' THEN 'D'
    END) as '등급'
 FROM EMP;
 
 
 -- 3중 조인 --
SELECT * FROM A
INNER JOIN B
ON A.칼럼1 = B.칼럼1
INNER JOIN C
ON B.칼럼2 = C.칼럼2;

 

 

Database(데이터베이스)

- 데이터의 집합

- 관련있는 대용량의 데이터 집합들을 체계적으로 구현해 놓은 것

- 여러명 사용 가능, 데이터 처리, 여러 개의 Database 관리 가능

- DBMS(Database Management System) : 데이터베이스를 운영, 관리 하는 Software

 

 

MySQL Oracle, 무료, 유료
MariaDB MariaDB, 무료
Oracle Oracle, 상용 시장 점유율 1위
DB2 IBM, 메인 프레임 시장 점유율 1위
SQL Server Microsoft, 중/대형급 시장 사용
PostgreSQL PostgreSQL, 무료

 

DBMS(Database Management System) 특징

(1) 무결성 : 데이터의 오류 X, constraints(제약 조건)

(2) 독립성 : DB 물리적 크기, 위치 변경에도 SW에 영향을 끼치지 않는다.

(3) 보안성 : 계정관리, 권한 설정

(4) 중복 최소화 : 자료 중복, 데이터 종속성 해결

(5) 안정성 (backup/resotre) 

 

 

DBMS의 종류

(1) 계층형 DBMS : 각 계층은 tree 형태, 변경이 어렵다는 단점

(2) 네트워크 DBMS : 계층형의 단점을 보완, 모든 구조를 이해해야 하기 때문에 구현이 어렵다.

(3) 관계형 DBMS : 테이블(table)이라는 최소 단위로 구성. 

- 테이블 : 열(column) + 행(row)

 

(4) 객체지향 Database

(5) 객체-관계형 Database : 대표 Oracle. 관계형 데이터베이스에서 객체지향의 장점을 추가한 데이터베이스

- 사용자 타입 지원

- 참조 타입 지원 : 레코드가 다른 레코드 참조 가능

- 중첩 테이블 지원 : row가 다른 테이블로 구성

- 객체 간의 상속 가능

 

 


DBMS 구조

- Table : 데이터를 저장하기 위한 "표" 형태의 구조(relation)

- PK : 각각의 row를 unique하게 식별할 수 있는 column의 집합

 

Schema(스키마)

- database 안에서 (data의 구조, 표현 방법, 타입, 관계) 형식 언어를 이용해서 정의한 구조

- MySQL(MariaDB)에서는 schema = Database

(1) 외부 스키마 external schema : 사용자 입장에서 데이터베이스 모습으로 조직의 일부분 정의

(2) 개념 스키마 conceptual schema : 데이터를 통합한 조직 전체의 데이터베이스 구조를 논리적으로 정의 -> data의 논리적 구조

(3) 내부 스키마 Internal schema : 전체 데이터베이스의 물리적 저장 형태 기술

 

 

스키마 생성 실습

- schema : shopdb

- table 2개 생성

1. memberTBL

열 이름(한글) 영문 이름 데이터 형식 길이 NULL 허용
아이디 memberID 문자(CHAR) 8글자(영문) X
회원 이름 memberName 문자(CHAR) 5글자(한글) X
주소 memberAddress 문자(CHAR) 20글자(한글) O

 

2. productTBL

열 이름(한글) 영문 이름 데이터 형식 길이 NULL 허용
제품 이름 productName 문자(CHAR) 4글자 (한글) X
가격 cost 숫자(INT) 정수 X
제조일자 makeDate 날짜(DATE) 날짜형 O
제조회사 company 문자(CHAR) 5글자(한글) O
남은 수량 amount 숫자(INT) 정수 X

 


Index

- primary key를 설정하려면, 해당 column index가 설정

 

 

view

- 가상의 테이블

(1) 안전하게 데이터 유지

(2) 보안적인 측면

(3) 사용의 편리성

 

 

Procedure(프로시저)

- 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합

- 여러줄의 쿼리문을 한 번의 요청으로 실행할 수 있도록 해준다.

- 장점 : 최적화, 캐시, 유지 보수, 트래픽 감소, 보안

- 단점 : 호환성, 성능, 디버깅

 

 

Stored Procedure(저장 프로시저)

- 함수 Interface 제공

 

 

Trigger

- 테이블에 부착

- Insert, Update, Delete가 발생한다.

- 테이블에서 회원정보를 삭제해야 하는 경우 -> 일반적으로 flag(update)

 


MySQL workbench utility

(1) SQL 구문 자동 생성

(2) Query editor 설정

- 예약어 대문자로 변경

- 자동완성

- 주석쿼리

- SQL 구문의 표준 형태로 변경

(3) 사용자 생성과 권한

 


SQL : SELECT 구문

SELECT 

FROM

WHERE 조건

GROUP BY 

HAVING 조건

ORDER BY

변수명 표기법(Naming Convention)

 

 

카멜 표기법(Camel Case)

- 주로 Java에서 사용

- 앞 단어를 제외한 단어의 첫 번째를 대문자로 표기한다.

- firistName

 

파스칼 표기법(Pascal Case)

- 모든 단어의 첫 번째를 대문자로 표기한다.

- FirstName

 

스네이크 표기법(Snake Case)

- 주로 C에서 사용

- 모든 단어는 소문자, 단어를 구분하기 위해 _ 사용

- first_name

 

헝가리안 표기법(typeHungarian Case)

- 접두어에 자료형을 표기해준다.

- strFirstName

운영체제

- 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층

- 모든 컴퓨터 시스템의 필수적인 부분

- 강의 목표 : 운영체제의 개념과 역할, 운영체제를 구성하는 각 요소 및 그 알고리즘의 핵심적인 부분에 대해 기초부터 학습

 

(1) 운영체제와 소프트웨어 또는 사용자와 어떻게 상호작용?

(2) 하드웨어를 어떻게 인터페이스 해야하는지?

 

운영 체제의 목표

- 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공

- 컴퓨터 시스템의 자원을 효율적으로 관리(프로세서, 기억장치, 입출력 장치 등등)

ex. 자원이 부족할 경우, 실행중인 프로그램들에게 짧은 시간의 CPU 할당

ex. 실행중인 프로그램들에 메모리 공간을 적절히 분배


운영체제 소개

좁은 의미의 운영체제

- 커널(Kernel)

- 운영체제의 핵심 부분으로 메모리에 상주하는 부분

- 주로 운영체제를 뜻하는 것은 이 부분

 

넓은 의미의 운영체제

- 커널을 포함해서, 각종 주변 시스템 유틸리티를 포함한 개념

 

운영 체제의 분류

(1) 동시 작업 가능 여부

- 단일 작업(single tasking) : 한 번에 하나의 작업만 처리, MS-DOS

- 다중 작업(multi tasking) : 동시에 두 개 이상의 작업 처리, UNIX, MS Windows

 

(2) 사용자의 수

- 동시에 접속할 수 있는지? 여부

- 단일 사용자(single user) : MS-DOS, MS Windows

- 다중 사용자(multi user) : UNIX, NT server

 

(3) 처리 방식

- 일괄 처리(batch processing) 

-> 작업 요청을 모아서 한꺼번에 처리, 작업이 완전 종료 되기 전까지 기다려야 한다.

-> 한 번 돌아갈 때마다 시간이 오래 걸리기 때문에, 작업이 오류가 나지 않는 것이 중요했다.

 

- 시분할(time sharing)

-> 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할

-> 일괄 처리보다 빠른 응답 시간

-> interactive

 

- 실시간(RealTime OS)

-> (데드라인)정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 한다.

-> hard realtime system(경성 실시간 시스템)

-> soft realtime system(연성 실시간 시스템)

 

용어 정리

- Multitasking : 하나의 프로그램이 종료되기전에 다른 프로그램이 실행되는 것

- Multiprogramming : 여러 프로그램이 메모리에 올라가 있는 것을 강조

- Time sharing : CPU를 분할하여 나누어 쓰는 의미 강조

- Multiprocess : 하나의 컴퓨터에 CPU(processor)가 여러 개 붙어 있는 것을 의미

 


운영 체제의 예시

 

유닉스(UNIX)

- 대형 컴퓨터를 위해 만들어짐 -> multitasking

- 유닉스를 만들기 위한 C 언어 등장 /  높은 이식성(portability) / 최소한의 커널(운영체제) 구조

 

DOS(Disk Operating System)

- MS사에서 만든 단일 사용자용 운영체제

- 메모리 관리 능력의 한계(주 기억 장치 : 640KB)

 

MS Windows

- MS사의 다중 작업용 GUI 기반 운영체제

- Plug and Play, 네트워크 환경 강화

- 불안정성

- 풍부한 자원 소프트웨어

 


운영 체제의 구조

 

CPU 스케줄링

- 누구한테 CPU를 줄 것인지?

- 처리시간이 긴 것들을 먼저 처리하는 것보다 빠른 것을 먼저 처리하면 평균 속도가 줄어든다.

 

메모리 관리

- 한정된 메모리를 어떻게 쪼개서 쓸 것인지?

- 어떤 메모리를 내보낼 것인지?

 

파일 관리

- 디스크에 파일을 어떻게 보관할 것인지?

 

입출력 관리

- 각기 다른 입출력 장치와 컴퓨터 간에 어떻게 정보를 주고 받게 할 것인지?

- 인터럽트(interrupt) 사용

'CS > 운영체제' 카테고리의 다른 글

[운영체제] Swap memory 스왑 메모리  (1) 2023.12.19
[운영체제] 운영체제 요약 정리  (0) 2023.07.09

DFS vs BFS

- 모든 경우의 수를 고려하는 문제 -> DFS

-> BFS로 구현시 큐의 크기가 커진다.

 

- 트리의 깊이가 큰 경우 -> BFS

-> DFS로 구현시 무한 루프 발생

 

- 최단 거리 구하기 -> BFS

 

깊이 우선 탐색 DFS

- 트리에서 말단까지 도착할 때까지 한 쪽 방향으로만 내려가는 방식

- 말단에 도착하게 되면 다시 돌아와서 다른 방향으로 간다.

 

백트래킹

- DFS 활용

- 해를 찾는 도중, 찾는 해가 아닐 경우 되돌아가서 해를 찾는 방법

- ex) N-Queen

 

너비 우선 탐색 BFS

- 모든 분기점을 다 검사하면서 진행

- Queue 사용

 

최선 우선 탐색

- BFS에서 업그레이드 된 방식

- 우선순위 큐 사용

- 현재 가장 최적인 경우를 우선적으로 검사하기 때문에 BFS보다 상대적으로 효율적이다.

 

+ Recent posts