멋쟁이 용두리처럼

모여서 각자 코딩, 멋쟁이 용두리처럼
코딩 문화를 만들어갑니다.

모여서 각자 코딩, "모각코" 자세히보기

2022_모각코

[2022년 11월 08일 멋쟁이용두리처럼 4번째 회의]

멋진취준생 2022. 11. 30. 06:41

안녕하세요!

모각코-멋쟁이용두리처럼 팀입니다!

11월 08일날 모각코-멋쟁이용두리처럼 네 번째 회의를 진행했습니다!

이 날은 각자 준비하는 자격증 공부와 알고리즘 문제를 풀어보는 시간을 가졌고, 현재까지 본 면접의 회고와 앞으로 보게 될 면접 준비 겸 공부를 위해 CS 부분을 공부해봤습니다!

 

SQLD 자격증을 취득하기 위한 최소한의 정리와 알고리줌 풀이, 그리고 운영체제에 대한 정리를 기록해보겠습니다!

한번 시작해볼까요~? ^__^

 

김xx

"저는 SQLD 자격증 공부를 위한 최소한의 정리를 소개해보겠습니다"

 

노xx

"현재까지 본 면접의 회고와 앞으로 보게 될 면접 준비 겸 공부를 위해 이번에는 CS 부분을 기록해보았습니다.

이번 주는 운영체제를 주제로 공부했습니다."

 

최xx

"저는 탐색(순차탐색, 이진 탐색)과 이코테 책의 DP 문제 풀이를 진행하였습니다!"

김x연

"알고리즘을 다지기 위해 계속해서 백준문제를 진행하였습니다!"


✏️ SQLD 자격증 60점을 넘기 위한 필수내용

 

1. SQL 명령문 개괄

- 우선, 연산순서 정렬하는 문제가 나올 수 있습니다.

from - where - group by - having - select - order by 등이 있어요!

 

- 종류에는 무엇이 있을까요?

DML(data manipulation language) : select, insert, delete, update, merge...

DDL(data definition language) : alter, create, modify, drop, rename...

TCL(transaction control language) : roll back, commit...

DCL(data control language) : grant, revoke

2. SELECT

- distinct 는 "집약"해주는 기능을 한다고 보시면 됩니다!

(ex) 10, 10, 20, 20, 30 ,...=> 10, 20, 30 으로 원하는 정보를 집약시켜주는 것이 DISTINCT

 

- distinct deptno, mgr 는 distinct (deptno, mgr)과 같이 괄호를 친 것과 같은 효과입니다.

= group by deptno, mgr 이랑 비슷하다고 보시면 돼요!

3. AS

- SELECT 절에 쓰는 것 : 1) AS 생략 가능, 2) 칼럼명에 띄어쓰기 있는 경우 (ex) "직원 번호"

- FROM 절에 쓰는 것 : 1) AS 사용 불가!

4. concat

- SQL server에서는 + 라는 기호를 쓰고

- Oracle에서는 || 라는 기호를 씁니다!

- concat(_,_) : 인수(parameter)는 반드시 "2개"여야 합니다! (3개, 4개 불가!)

5. 논리 연산자 

- and, or, not

- 연산순위 : NAO(나오) 라고 외워봅시다! (Not And Or 순)

(ex) NOT <조건1> AND <조건2> AND NOT <조건3> OR <조건4>

     (not <조건1> 이 새로운 <조건5>, not <조건3>이 새로운 <조건6>)

= <조건5> AND <조건2> AND <조건6> OR <조건4>

= (<조건5> AND <조건2> AND <조건6>) OR <조건4> 

     (and 먼저)

6. SQL 연산자

- BETWEEN

 (ex) A between 1 and 2 는 1 <= A <= 2 랑 의미가 같다.

 

- IN

(ex) A in (1, 2, 3) 는 A=1 or A=2 or A=3 랑 의미가 같다.

 

- 와일드카드 쓰는법이 안나올리가 없겠죠!?

LIKE : _  : 미지의 한 글자

         : % : 0 이상의 글자

         : escape : (_%)를 문자로 취급해주는 함수

 

- 예시를 통해서 무슨 뜻인지 자세히 알아봅시다!

(ex) '_L%' 는 이름에 두번째 글자가 L인 사원들을 다 고르는 것~ 등의 의미로 쓸 수 있습니다.

(ex) 'a%' : a로 시작하는 데이터

       '%a' : a로 끝나는 데이터 

       '%a%' : a가 포함되어 있는 데이터 

(ex) 문자열에서 '_'가 포함되어 있는 row 검색은 어떻게 할까요?

      = SELECT * FROM A

         WHERE col2 LIKE '%@_%' ESCAPE '@'

      = SELECT * FROM A

         WHERE col2 LIKE '%[_]%' 

(여기서 '@'는 아무글자나 다 됩니다! (# 으로도 많이 쓰곤 해요))

 

- SQL server에서는 TOP

(select 절에서 top (n) 컬러명 은 컬럼을 출력할 때 상위 n개를 가져오겠다는 말입니다)

- Oracle에서는 ROWNUM

(ex) SELECT empno, sal

       FROM emp

       WHERE rownum <= 3

       ORDERBY sal DESC

명령문에서, ORDERBY 절은 가장 마지막에 실행됩니다.

예를 들어

sal 정렬 전 테이블이             sal 정렬 후 테이블이 

.......     1500                                      .......     5000

.......     1700                                      .......     4500

.......     1800                                      .......     3000

              .....                                                     .....

형태라면, ORDERBY 가 가장 마지막에 실행되므로, 정렬전의 테이블에 ROWNUM의 조건절이 실행이 됩니다.

그런 후에, ORDERBY 가 실행되어서 

.......     1800 

.......     1700 

.......     1500

이렇게만 출력이 될 것입니다.

 

7. NULL

무조건 나오는 문제, 바로 NULL 입니다.

1. NULL의 정의는 부재, 모르는 값을 의미합니다.

2. NULL+2, NULL-4, NULL x NULL ... 등의 NULL의 '산술연산'은 모조리 다 NULL 입니다.

3. NULL의 '비교연산'은 무조건 IS, IS NOT으로만 비교할 수 있습니다.

(ex) NULL = NULL 이나 NULL = 2 등의 등호를 사용하는 등의 형식은 불가입니다!

알수없음의 논리로 해석되어서 사실상 False입니다!

 

4. 정렬에서 NULL의 의미

: Oracle에서는 양의 무한대(∞)를 의미하고, SQL SERVER에서는 음의 무한대(-∞) 를 의미합니다.

즉, 오름차순 기준으로 Oracle에서는 null이 있는 값을 정렬하면 null 이 맨 마지막에 나오고, 

sql server에서는 null이 있는 값이 맨 처음에 나옵니다.

 

- NVL(값1, 값2) : 값1이 Null 이라면, 값2, 아니라면 값1  - (*널뛰기 라고 외워봐요!) 

- NVL2(값1, 값2, 값3) : 값1이 Null이라면, 값3, 아니라면 값2

- isNull(값1, 값2) : NVL과 동일한 함수

- Null if(값1, 값2) : 값이 같으면 null, 다르면 값1             - (*같이놀자! 라고 외워봐요!) 같으면 (null) 아니면 값1

- coalesce(값1, 값2, 값3,...) :  null 이 아닌 첫 번째 값    - (coalesce 인자는 무제한)

(ex) coalesce(null, null, 2, ....) = 2 

       coalesce(2,1,3,...) = 2

       coalesce(null,3,...) = 3

8. 정렬

- 정렬의 특성  1) 가장 마지막에 실행!

                       2) 성능이 느려질 가능성이 존재!

                       3) null 값과의 관계 => Oracle에서는 양의 무한대(∞) 로 취급!

- 컬럼번호로 정렬  : 출력되는 컬럼의 수 보다 큰 값이 불허!

- 인수 2개 정렬

     (ex) sal desc, ename asc   : sal이 같으면, ename 오름차순

- SELECT 절에 칼럼명이 없어도 정렬 가능

     (ex) SELECT ename 

             ORDERBY sal

       =  sal 이 없는데도 sal로 정렬하는 것이 가능!

9. 숫자 함수

- round 자릿수 

(ex) SELECT ROUND(138.947, _ , _) : _ 인수가 무엇인지에 따라 다른 결과를 나타냅니다!

(세번째 인수가 생략되어 있거나 0이면, 반올림을 의미합니다!, 음수면 버림을 뜻합니다.)

(ex) SELECT ROUND(138.947, 1) : = 138.9 (소수 1번째 자리까지 반올림) 

(ex) SELECT ROUND(138.947, 2, 0) : = 138.950 (소수 2번째 자리까지 반올림)

(ex) SELECT ROUND(138.947, 2, -1) : = 138.940 (소수 2번째 자리까지 버림)

 

- ceil 함수(oracle에서는 ceil, sql server에서는 ceiling) : 정수값으로 출력

(ex) SELECT CEIL(21.35) : = 22 

 

- floor 함수 : 정수값으로 출력

(ex) SELECT ROUND(21.95) : = 21

 

10. 문자열 함수

- upper : 대문자로 바꾸는 함수

- lower : 소문자로 바꾸는 함수

 

- LPAD : 문자길이 왼쪽부터 총길이만큼 지정한 문자를 채우는 함수

  (ex) LPAD(컬럼명, 5, ' ')  =>      30

- RPAD : 문자길이 오른쪽부터 총길이만큼 지정한 문자를 채우는 함수

  (ex) RPAD(컬럼명, 5, ' 0') =>  30000

 

- TRIM : 양쪽 공백이나 특정문자를 제거하는 함수

  (ex) TRIM('문자열') :      NEWYORK      => NEWYORK

- LTRIM : 왼쪽 공백이나 특정문자를 제거하는 함수

  (ex) LTRIM('문자열', '0') : 0010 => 10

- RTRIM : 오른쪽 공백이나 특정문자를 제거하는 함수

  (ex) RTRIM('문자열', '0') : 0010 => 001

 

- substr : 문자열 자르는 함수 

  (ex) substr('문자열', 1, 4) : 1번째 글자부터 4개 자르기

  (ex) substr('문자열', 10) : 10번째 글자부터 끝까지 자르기

  (ex) substr('문자열', -3) : 뒤에서 3번째 번째 글자부터 끝까지 자르기

- Instr : 시작위치 인덱스 출력하는 함수

11. 날짜 함수

* 형변환을 일으키는 함수

=> to_char , to_date -- 실습을 해보세요!

 

- oracle에서는 sysdate

- sql server에서는 getdate

  (ex) 날짜데이터 + 100 : 100일 이후라는 의미 (days로 인식합니다!)

12. DECODE/case

- case만 살펴보자면, 

case WHEN then ...1

         WHEN then ...2

else ...(else가 없는 경우, 1,2 만족하지 않는다면) = null 이 출력됩니다!

end

13. 집계함수

- null 과의 관계!!

(ex)

  A      B      C

null   null    1

  3      2      2

null    2      3

의 테이블이라면, 

sum()은 자동으로 null 값을 제외시키기 때문에,

 

sum(A) = 3

sum(B) = 4

sum(C) = 6

로 나타낼 수 있습니다.

count(A) = 1  (count(컬럼)이면 null 값을 제외한 3뿐이니까!)

count(*) = 3   (count * 은 row개수를 세는데, null 값이 포함된 row도 다 포함합니다!)

 

그렇다면, sum(A+B+C) 는 무엇일까요?

sum(A) + sum(B) + sum(C) 와는 값이 다른데요, 우선, sum(A) + sum(B) + sum(C) = 3 + 4 + 6 = 13 입니다. 

sum(A+B+C)로 하면, 테이블을 우선 합쳐주고 sum 하기 때문에,

 A+B+C

   null

    7

   null     

형식의 테이블이 나와서, sum(A+B+C)는 7입니다!

이 부분 주의해주세요!

14. GROUP BY

개략적인 특징

- 집약기능이 있습니다

- where 다음에 실행이 됩니다. (HAVING)

- 그룹수준의 정보를 바꿉니다.

15. JOIN

- natural join에서는 alias 사용 불가입니다!

- using

- 중복된 컬럼 "하나"로 출력합니다. (중복된 컬럼은 제일 앞에 등장)

 

- left outer join

(ex) A left outer join B 가 무엇이랑 동일한가?

 = A col1 = B col1 (+)

= left면 반대로 오른쪽에 붙여서 

= 왼쪽이 뚱뚱해지는데, (+) 기호를 join key column 뒤쪽에다 붙이기 때문입니다!

(ex) FROM A , B, C

   조인순서는 join은 A,B 먼저 그 다음에 C 순으로~

16. 서브쿼리

- select : scalar

- from : inline view --> 메인쿼리의 컬럼 사용 가능합니다!

- where : 거의 모든 서브쿼리

- group by : 사용못함! (X)

- having : 거의 모든 서브쿼리

- order by : scalar

 

(ex)

SELECT

FROM

WHERE SELECT

               FROM B col

               A col 1

바깥 테이블이 A테이블 안쪽 테이블이 B테이블 이라고 하면, 

col 1 = A를 찾고 한 번 돌아갈 때마다 다 돌립니다. (for문이랑 비슷하다고 생각하시면 됩니다)

 

- 함수 : in , any/some, all, exist(해당 문자가 존재하면 True, 0 rows 면 False)

 

17. 집합 연산자

- union 

- intersect

- minus(except)

- union all

union, intersect, minus(except)는 정렬작업이 있기 때문에 다소 느린편입니다.

반면, 정렬작업이 없는 union all은 빠르다는 특징이 있습니다!

union all 중복데이터가 존재하고 빠르다는 것을 기억하시면 될 듯 합니다!

 

18. DDL

- "TCL"과 연관지어서 생각할 필요가 있습니다.

- 항상 TCL인 roll back과 commit과 연관되어 문제가 출제되기 마련입니다.

 

1. TRUNCATE VS DROP

TRUNCATE 와 DROP 은 둘다 DDL인데,

TRUNCATE 입주민 퇴거 개념으로 이해하시면 됩니다. 즉, 구조가 남는다는 의미죠!

하지만, DROP 철거로 이해하면 편합니다. 구조도 삭제하기 때문이죠!

 

2. TRUNCATE VS DELETE

TRUNCATE는 DDL 인데, 비슷한 기능인 DML로서 DELETE가 있다는 것도 알아두면 좋습니다!

19. DML

- insert, update, delete 에서는 insert의 오류상황을 살펴보고 시험보러 들어가세요!

역시 TCL인 roll back과 commit과 연관되어 문제가 출제되기 마련입니다.

- merge도 DML 인것을 잊지마세요!

20. 제약조건

PK = unique + not null

- PK는 null 이 아니어야 하고 하나만 존재해야 합니다!

21. DCL 제약조건

- grant, revoke 정의를 살펴보세요! grant는 권한을 부여하는 것, revoke는 권환을 다시 회수하는 명령어입니다!

- role의 특징은 객체이지, 명령어가 아니라는 점입니다. table, index, view,.. 처럼 role도 하나의 객체입니다!

1) role은 role에게 부여가 가능

2) role은 사람에게도 부여가능

3) 사람들은 같은 role을 가질 수 있음

4) rol을 부여하려면 권한이 필요

등으로 role의 특징을 정리할 수 있겠군요!

 

- grant에서의 on to 문법 revoke에서의 on from 문법도 기출로 살펴보고 가세요!

22. VIEW

- 장점부터 외워봅시다. 독 편 부 !

  • 립성 : 기존 테이블의 구조가 변경되어도, VIEW를 따로 update할 필요는 없습니다.
  • 리성 : 편리하다. 계속 테이블을 조작할 필요가 없고, 쓸 때 마다 나옵니다. 
  • 관성 : 원하는 정보만 줄 수 있습니다.

- 단점

  • 뷰에 인덱스를 구성할 수 없다
  • 뷰를 포함하여 뷰를 만든 경우 연관 뷰를 삭제하면 생성된 뷰도 삭제된다
  • 한번 정의된 뷰는 수정이 불가하다

23. 그룹함수

(ex) 결과값을 주고 무엇을 썼는지 물어보는 문제가 나옵니다.

- roll up

- cube

- grouping sets

 

roll up에 인수가 2개인 경우에

roll up(A,B)

roll up(B,A)

 다른 결과가 나옵니다. (계층구조이기 때문에!) 즉, ROLLUP함수는 인수의 순서에도 영향을 받게 됩니다.

 

cube에 인수가 2개인 경우에

cube(A,B)

cube(B,A)

 같은 결과가 나옵니다. 즉, CUBE함수는 인수의 순서에 무관하게 결과가 같습니다.

 

(ex) 표를 주고, ROLLUP 인지 CUBE인지, GROUPINGSETS 인지 판단하는 문제가 나옵니다.

1) 먼저 NULL 값을 다 찾으세요!

2) 총합행이 있는지 없는지 찾으세요!

2-1) 만약 총합행이 없다(X)면, GROUPINGSETS 입니다.

2-2) 만약 총합행이 있다(O)면, 한쪽만 결과가 나와서 계층구조로 나오면 ROLL UP입니다. (행의 수가 적습니다.)

                                                 양쪽으로 둘 다 결과가 나오면 CUBE 입니다.(행의 수가 많습니다.)

24. TCL

- commit, roll back ..> 데이터 무결성을 보장합니다.

- auto commit off and begin transaction ..-> DDL에 commit 기능을 없애는 것입니다.

25. 윈도우 함수

- 반드시 나오는 문제 중 하나입니다.

1) ROWS vs RANGE

   : 결과값의 "차이점"을 숙지하세요! ( 같은 값 있는지 없는지의 유무!!)

   : ROWS 조회된 ROW 하나하나를 대상으로 연산하며,
   : RANGE는 ORDER BY 를 통해 정렬된 컬럼에 같은 값이 존재하는 ROW가 여러 개일 경우, 동일한 컬럼값을 가지는 모      든 ROW를 묶어서 연산을 합니다.

  

2) RANK vs DENSE_RANK

   : RANK 중복을 건너뜁니다. (ex) 1, 1, 3, 4, ...

   : DENSE_RANK 중복을 건너뛰지 않습니다. (ex) 1, 1, 2, 3, ...

 

3) PARTITION BY vs GROUP BY

결론은 데이터 다 보고 싶으면 PARTITION BY, 요약해서 하나씩 한줄씩만 보려면 GROUP BY

 

26. 계층형 질의

- 프자부 부자순! 으로 외워봅시다.

- Prior 식데이터 = 모데이터 (부모데이터 = Prior 자식데이터)

- 모에서 식으로 가면 방향

(ex)  level 1    King ... empno

        level 2    James ... mgr

        level 3    Scott

현재 level2라면, James의 mgr이 이전의 King의 empno다. 

즉, Prior empno = mgr 로 표현할 수 있습니다.

실습은 이렇게 풀어야 합니다. 이론과는 다른 느낌입니다. 꼭 실습을 해보세요!

 

27. 절차형 PL/SQL

- Exception은 생략이 가능합니다!

- Procedure Trigger user_defined_function 차이점을 기억하세요!

- Procedure : 반드시 값이 안나옵니다.

- Trigger : roll back, commit이 불가능합니다. 보통 DML 많이 씁니다.

- user_defined_function : 반드시 값이 나옵니다.

28. 데이터 모델링

- 현실에서의 업무를 데이터 모델화 할 수 있습니다.

1. 데이터 구조화는 "업무"에만 집중해서 정보시스템을 만듭니다. Process 중심이라고 볼 수 있죠!

(ex) 서점을 예로 든다면

  [책] - [돈 받는다] - [매출이 오른다] 처럼

"절차"에 따라서 프로그래밍이 이루어집니다.

 

2. 관계형 데이터베이스 

- 데이터 "자체"의 "관계"를 중심으로 모델링 하는 방법이 바로 관계형 데이터베이스 입니다.

(ex) 서점에서도 [배송 process]가 있고 [광고 process]가 있고 [매출 process]가 있듯이, 각각의 process가 존재합니다.

       각자 process가 다르기 때문에, 업무에만 집중해서 정보시스템을 만든다면, 정보의 중복이 발생하고, 데이터 quality가 떨어지는 비효율적인 현상이 발생합니다.

그래서, 1970년대에, 이런 데이터 자체의 관계를 중심으로 모델링하는 관계형 데이터베이스가 나왔습니다. 우리가 배우는 DB가 바로 이 관계형 데이터베이스입니다.

 

3.객체지향 데이터베이스

- object 중심으로 모델링 하는 방법입니다. 

- 하지만, 너무 복잡한 탓에, 잘 쓰이지 않게 됐습니다.

29. 엔터티(entity)

- 관계형 데이터베이스의 데이터 자체는 엔터티를 뜻합니다.

- 관계형 데이터 베이스 지도를 그리기 위한 기초 개체인 엔터티에 대해서 알아봅시다!

- 먼저, 엔터티란 관리하고자 하는 "대상"을 뜻합니다.

(ex) 병원에서 환자를 관리할 때, entity가 무엇이 될까요? => "환자"가 엔터티가 됩니다.

 

- 특징을 살펴봅시다

1. 인스턴스는 2개 이상이어야 합니다.

2. 관계는 하나 이상 가져야 합니다.

3. "업무 프로세스"에 이용되어야 합니다.

 

- 엔터티 분류도 살펴보고 가시죠!

유 개 사 / 기 중 행 으로 외워봅시다!

"형 엔터티, 념 엔터티, 건 엔터티"

"본 엔터티, 심 엔터티, 위 엔터티"

로 분류 할 수 있습니다.

30. 속성(attribute)

- 관리하고자 하는 대상의 "인스턴스"의 특성, 속성을 뜻합니다.

- 속성은 인스턴스들의 집합이라고 할 수 있죠!

(ex) 사람 중에서 Scott이라는 사람의 얼굴을 구성하는 눈,코,입 등이 다 속성이 될 수 있습니다.

 

- 속성의 분류도 알아봐야겠죠?

기 설 파 로 외워봅시다.

- 본 속성: 업무로부터 추출한 모든 속성이 여기에 해당하며 엔터티에 가장 일반적이고 많은 속성을 차지한다

- 계 속성 : 업무상 필요한 데이터 이외에 데이터 모델링을 위해, 업무를 규칙화하기 위해 속성을 새로 만들거나 변형하여 정의하는 속성

- 생 속성: 다른 속성에 영향을 받아 발생하는 속성으로서 보통 계산된 값들로 다른 속성에 영향을 받기 때문에 될 수 있으면 적게 정의하는 것이 좋습니다.

 

31. 도메인

- 도메인은 (데이터 유형, 크기, 제약조건, check, primary key) 등 "값의 범위"를 의미합니다!

 

32. 관계

- IE표기법  Barker표기법의 차이를 숙지해야 합니다.

 

<IE 표기법>

- 관계는 둘 다 까마귀 발로 표현 합니다. (1:1 이든 1:N이든)

- IE 표기법에서는 엔터티가 각진 사각형입니다.

- 식별자를 맨 위에다가 표시합니다.(PK)

- 1번이 2번을 어떻게 취급하는지에 따라 그림이 달라지니 유의하세요! (상속에 따라 다름)

 

<Barker 표기법>

- 역시 관계 표현은 까마귀 발로 표현합니다.

- Barker표기법에서는 엔터티의 모서리가 둥근형태의 사각형입니다.

- 식별자를 #으로 표기합니다.

- 1번이 2번을 어떻게 취급하는지에 따라 그림이 달라지니 유의하세요! (상속에 따라 다름)

 

33. 식별자

- 식별자와 비식별자 관계는 위 ERD에서처럼 알 수 있습니다.

(ex)

- 주식별자의 특징

: 유 최 불 존 으로 외워봅시다!

1) 일성 : 인스턴스를 유일하게 구분할 수 있는 속성

2) 소성 : 여러가지 속성을 묶어서도 식별자가 가능한데, 그것이 최소여야 하는 것

3) 변성 : 한번 만들어놓으면 바뀌지 않는 것

4) 재성 : not null ( null 이 허용되지 않음)

=> 이 4가지 특성을 다 만족하면 후보키(Candidate key)가 될 수 있고, 그 주에서 대표로 선정된 것이 기본키(Primary key)가 되는 것입니다! 나머지는 대체키(Alternative key)가 되겠죠!

 

34. 식별자 관계/ 비식별자 관계

- 식별자 vs 비식별자 로 살펴본다면,

 

식별자 강한관계입니다. 단점은 SQL 구문이 복잡해집니다.(PK 속성수가 증가하기 때문이죠)

ERD에서 표기법은 식별자는 실선

VS

비식별자 약한관계입니다. 단점은 '조인'이 많아져서 느려집니다.

이고, 비식별자는 점선입니다.

 

(※ ERD 서술 규칙을 살펴본다면,

1) 시선이 좌상단 => 우하단 으로 움직여야 합니다.

2) 관계명을 반드시 표시 안해도 됩니다!

3) UML은 객체지향에서만 쓰입니다!)

 

35. 성능 데이터 모델링

- 백종원의 골목식당 컨설팅이라고 생각해봅시다!

1) 아키텍처

(데이터 베이스 "구조"를  계속 바꾸는 방법입니다)

테이블, 파티션,..

 

(ex) 테이블을 자르거나 분할하거나, 파티션을 나누거나 등등의 방법으로

말 그대로, 아키텍처를 뜯어 고치면서 성능을 개선하는 방법입니다. 

백종원의 골목식당에서 주방구조부터 싹 다 바꾸는 것과 비슷하다고 할까요?

 

=> 가장 효과적인 방법이죠.(구조부터 바꾸는 것이니까요!) (

 

VS

 

2) SQL 쿼리문(명령문)

조인수행원리, optimizer, 실행계획,..

등을 통해 성능을 개선시키는 방법입니다.

조인수행원리는 꼭 나오는 문제이니까 반드시 숙지하시길 바랍니다!

36. 정규화

- 매우 중요한 파트입니다. 데이터 모델링보다 먼저 해야 하는 것이 정규화 과정입니다.

- 1차 정규화 : 원자성 확보 (속성 값 2개인 것 자르기)

제1 정규형은 다음과 같은 규칙들을 만족해야 한다.

더보기

1. 각 컬럼이 하나의 속성만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 칼럼의 순서가 상관없어야 한다.

제1정규화가 필요한 테이블
제 1정규화를 한 테이블

- 2차 정규화 : 부분함수 종속 제거 -> 예시를 보고 시험장 들어가세요!

제2 정규형은 다음과 같은 규칙을 만족해야 합니다.

더보기

1. 1정규형을 만족해야 한다.
2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 합니다. == 모든 칼럼이 완전 함수 종속을 만족해야 한다.

(부분적 종속이란 기본키 중에 특정 컬럼에만 종속되는 것이다.

완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 것이다.) => 비슷한 말입니다.

제 2정규화가 필요한 테이블

위 테이블에서 기본키는 (학생 번호, 과목)으로 복합키입니다.

그런데 이때 지도교수 칼럼은 (학생 번호, 과목)에 종속되지 않고 (과목) 에만 종속되는 부분적 종속입니다. 

 

따라서 제2정규화를 만족하지 않으므로 아래와 같이 분해해야 합니다.

제 2정규화를 한 테이블

 

- 3차 정규화 : 이행함수 종속 제거 -> 예시를 보고 시험장 들어가세요!

제3 정규형은 다음과 같은 규칙을 만족해야 합니다.

더보기

1. 2 정규형을 만족해야 한다.
2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.

이행 종속성이란 A->B, B->C 일 때 A->C 가 성립하면 이행 종속이라고 한다. 

위와 같은 테이블을 봅시다. ID를 알면 등급을 알 수 있습니다. 등급을 알면 할인율을 알 수 있습니다. 따라서 ID를 알면 할인율을 알 수 있습니다. 따라서 이행 종속성이 존재하므로 제 3 정규형을 만족하지 않는다.

3정규형을 만족하기 위해서는 아래와 같이 분해해야 합니다.

제 3정규화를 한 테이블

- BCNF(Boyce-Codd Normal Form) : 후보키가 상속하는 것을 제거합니다. 

BCNF는 제 3정규형을 좀 더 강화한 버전으로 다음과 같은 규칙을 만족해야 합니다.

더보기

1. 3정규형을 만족해야 한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.

(= 후보키 집합에 없는 칼럼이 결정자가 되어서는 안 된다는 뜻이다.)

BCNF가 필요한 테이블

위와 같은 테이블을 보자. (학생 번호, 과목)이 기본키로 지도교수를 알 수 있습니다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어서 과목-> 지도교수 종속은 성립하지 않습니다. 하지만 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 지도교수-> 과목 종속이 성립한다.

 

이처럼 후보키 집합이 아닌 칼럼이 결정자가 되어버린 상황을 BCNF를 만족하지 않는다고 합니다.

(참고로 위 테이블은 제3 정규형까지는 만족하는 테이블입니다. )

 

BCNF를 만족하기 위해서는 아래와 같이 분해하면 됩니다.

BCNF를 만족한 테이블

- 이상현상 보고 시험장 들어갑시다! 삽입 이상  삭제 이상 예시 살펴보세요!

- 성능은 어떻게 될까요?

=> SELECT 절에서는 JOIN 때문에 느려질 수 있습니다. (성능 저하)

=> INSERT, UPDATE 는 성능이 향상 합니다. ( table이 작아지기 때문이죠!)

37. 반정규화

- 반정규화는 데이터 무결성 해칩니다!

1) 대상분석 단계

- 먼저 대상을 분석합니다. 대범한 통조림! 을 기억하세요! (량범위, 위 처리 빈도수, 계 처리 여부)

- 를 거치고 반정규화를 들어가는 것이 아니라  2) 응클인뷰 단계를 거칩니다.

응클인뷰! 를 기억하세요! (용시스템 변경, 러스트링, 덱스,  테이블 처리)

 

이런 것들을 다 해보고 그래도 안되면 이제, 반정규화를 해야 합니다.

 

반정규화의 종류에는 테속관 을 기억하세요! 

 

<이블 반정규화> 

: 병합( 1:1 , 1: N , 슈퍼/서브) => (병합에 슈퍼/서브 있는 것 기억하세요!)

: 분할( 분테이블, 계 테이블, 복 테이블..) => (분할은 이 부분에 통증있어요~로 외워봅시다!)

 

< 반정규화>

: 생 컬럼, 류 컬럼(임시컬럼 만들어줌), 력 컬럼 추가, PK -> 속성 편입, 복 속성,... => 파오리P중으로 암기하세요!

 

< 반정규화>

: 복 관계 추가

38. 데이터에 따른 성능

- row migration

: 최초로 저장된 블락에 프리스페이스가 없어서 새로운 블락을 할당받아서 그곳으로 옮긴뒤 수정하는 것을 마이그레이션이 일어난다고 합니다.

- row chaining

: 로우 체이닝 하나의 값이 여러블락에 거쳐 저장될때를 말합니다.

저장엔 문제가없지만 SELECT 할 때 한블럭만 읽어도 될걸 여러블락을 읽어야하므로 성능이 떨어집니다.

한 번 예시를 찾아보세요!

 

* partitioning 도 보고 갑시다!

- list partitioning(목록 분할): 값 목록에 파티션 할당

- range partitioning(범위 분할): 분할 키 값이 범위 내에 있는지 여부로 구분 => 관리가 쉽습니다, 가장 많이 쓰입니다

- hash partioning(해시 분할): 해시 함수의 값에 따라 파티션 포함 여부 결정 => 관리가 정말 어렵습니다.

39. 슈퍼/서브 타입

용량이 작은 경우 => one to one 트랜잭션이 개별로 들어갑니다. (Identity)

용량이 큰 경우

  • Plus 타입 : 공통/차이점에 따라서 별개로 트랜잭션이 들어옵니다. (Roll down)

  • Single 타입 : 전체 통합적으로 트랜잭션이 들어갑니다. (Roll up)

(ex) 시험문제에서는 다음 중 그림을 보여주고 이것을 언제쓰냐~ 혹은 각 특징을 주고 어떤 Type인지 물어보는 문제가 출제 될 수 있습니다!

40. 분산 데이터 베이스 

- 투명성을 만족해야 합니다. (투명성에 대해서는 잘 안 물어볼 것 같습니다.)

- 분산 데이터 베이스의 정의 정도 알고가시죠

=> 여러 개의 서버를 뜯어놓은 개념으로 (반정규화와 유사합니다.) => 데이터 무결성을 해칩니다!

41. 조인 수행원리

- 정말 중요한 문제이죠! 기출로 이러한 유형에 대해서 다루고 가주세요!

1) Natural Join

: 랜덤 엑세스, 대용량 sort 작업시 유리합니다.

: 중첩된 반복문과 유사한 방식으로 조인을 수행합니다.

2) Sort Merge Join

: join키를 기준으로 정렬합니다. (등가 조인/ 비등가 조인)

3) Hash Join

: 등가 조인만 씁니다. (only 등가!)

: 선행 테이블 크기가 작습니다.

: hash 처리를 해야해서 별도 공간이 필요합니다.(데이터를 별도로 잡아먹습니다)

 

꼭 공부하고 가세요! (https://eehoeskrap.tistory.com/84) 이 블로그에 잘 정리 되어 있었습니다!

42. optimizer

- CBO (cost based optimizting)

   : "경로"를 다 짜봤을 때 제일 경제적인 것

   :  RBO에 비해 사용자의 의도대로 하기 힘듭니다. 업무중에 통계 수집은 절대 하면 안됩니다.

- RBO (rule based optimizing)

   : "규칙"에 기반

   : 단점 => 상황에 따라서는 인덱스를 사용하지 않는것이 성능에 이득이 될 수 있지만 RBO는 그런 상황에 대처하지 못합니다. 인덱스가 존재하면 무조건 사용합니다.

43. 인덱스

Q) 인덱스 언제 사용하지 않나요?

=> 부정형, LIKE 함수, 묵시적 형변환 일 때 안 씁니다!

 

Q) 인덱스 사용시 성능이 안 좋아지는 경우가 있나요? ( 느려지는 경우를 말합니다!)

=> insert, update, delete 와 같은 DML들의 성능이 저하됩니다!

(why? 책갈피(목차)를 만들어놨는데, 계속 페이지가 조작되면, 계속 목차를 새로 바꿔야 하기 때문입니다!)

 

44. 실행계획

- 실행순서 문제는 무조건 1문제 출제 됩니다.

(ex) 다음과 같은 순서일 때, 올바른 실행 순서는 무엇일까요?

blablablabla	# 1
		blablablabla	# 2
    			blablablabla	# 3
   	 	blablablabla	# 4
    			blablablabla	# 5

=> [ 3 -> 2 -> 5 -> 4 -> 1 ]

같은 레벨이면 뭉텅이로 생각하면 편합니다!

가장 바깥쪽 실행문이 가장 뒤입니다!

이상으로, SQLD 자격증을 위한 최소한의 정리를 해봤습니다.


다음은 CS 부분에 대해 살펴볼까요~?

 

현재까지 본 면접의 회고와 앞으로 보게 될 면접 준비 겸 공부를 위해 이번에는 CS 부분을 기록해보았습니다.

이번 주는 운영체제를 주제로 공부했습니다.

 

운영체제

  • 운영체제의 역할

1. CPU 스케줄링과 프로세스 관리: CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성과 삭제, 자원 할당 및 반환을 관리

2. 메모리 관리: 한정된 메모리를 어떤 프로세스에 얼마큼 할당해야 하는지 관리

3. 디스크 파일 관리: 디스크 파일을 어떠한 방법으로 보관할지 관리

4. I/O 디바이스 관리: I/O 디바이스들인 마우스, 키보드와 컴퓨터 간에 데이터를 주고받는 것을 관리

 

  • 인터럽트

어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것. 키보드, 마우승 등 IO 디바이스로 인한 인터럽트, 0을 숫자로 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생.

인터럽트 간에는 우선순위가 있고 우선순위에 따라 실행되며 하드웨어 인터럽트, 소프트웨어 인터럽트로 나눠짐.

 - 하드웨어 인터럽트: 키보드, 마우스 등 연결하는 일 등의 IO 디바이스에서 발생하는 인터럽트

 - 소프트웨어 인터럽트: 트랩 (trap)이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템 콜을 호출할 때 발동

    (시스템콜이란, 운영체제가 커널에 접근하기 위한 인터페이스로, 유저 프로그램이 운영체제의 서비스를 받기 위해 커널      함수를 호출할 때 사용)

 

  • 메모리

메모리 계층은 레지스터, 캐시, 메모리, 저장장치로 구성

- 레지스터: CPU 안에 있는 작은 메모리로, 휘발성, 속도 가장 빠름, 기억 용량이 가장 적음

- 캐시: L1, L2 캐시를 지칭, 휘발성, 속도 빠름, 기억 용량 적음

- 주기억장치: RAM을 지칭, 휘발성, 속도 보통, 기억 용량 보통

- 보조기억장치: HDD, SDD를 지칭, 휘발성, 속도 낮음, 기억 용량 많음

* 캐시는 데이터를 미리 복사해 놓은 임시 저장소로, 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이긴 위한 메모리. 실제로 메모리와 CPU 사이의 속도 차이가 너무 커 그 중간에서 레지스터 계층을 둬서 속도 차이를 해결

(웹 브라우저의 캐시로 쿠키, 로컬 스토리지, 세션 스토리지가 있다.)

 

- 메모리 할당

    - 고정 분할 방식: 미리 나누어 관리하는 방식, 융통성 X, 내부 단편화 발생 (내부 단편화란, 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상)

    - 가변 분할 방식: 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나누어 사용, 외부 단편화 발생, 최초적합, 최적적       합, 최악 적합이 있다. (외부 단편화란, 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하         는 현상)

    - 불연속 할당: 현재 운영체제가 쓰는 방법으로, 페이징, 세그멘테이션, 페이지드 세그멘테이션 기법 존재.

        - 페이징: 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스 할당. 홀의 크기가 균일하지 안               은 문제가 없어지지만 주소 변환이 복잡

        - 세그멘테이션: 프로세스는 코드, 데이터, 스텍, 힙 등으로 이루어지는데, 코드와 데이터 등 이를 기반으로 나눌 수 있             으며 함수 단위로 나눌 수도 있다. 공유와 보안 측면에서 우수하지만, 홀 크기가 균일하지 않음

        - 페이지드 세그멘테이션: 공유나 보안을 의미 단위에 세그먼트로 나누고 물리적 메모리는 페이지로 나누는 것.

 

- 페이지 교체 알고리즘

    - FIFO (First In First Out): 선입선출로, 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법

    - LRU (Least Recentle Used): 참조가 가장 오래된 페이지를 교체

    - NUR (Not Used Recently): 일명 Clock 알고리즘으로, 시계 방향으로 돌며 0을 찾는 순간, 해당 프로세스 교체하고 1           로 바꾸는 알고리즘

    - LFU (Least Frequently Used): 가장 참조 횟수가 적은 페이지를 교체, 가장 적게 사용한 것을 교체

 

  • 프로세스

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말하며, CPU 스케줄링의 대상이 되는 작업이라는 용어와 같다.

- 프로세스의 상태

    - 생성 상태 (New): fork(), exec()를 통해 생성, 이때 PCB가 할당

    - 대기 상태 (Ready): 메모리 공간이 충분하면 메모리를 할당받고 아니면 대기하고 있으며 CPU 스케줄러로부터 CPU 소유권이 넘어오는 것을 기다리는 상태

    - 실행 상태 (Running): CPU 소유권과 메모리를 할당받고 수행 중인 상태를 의미

    - 중단 상태 (Blocked, Waiting): 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태로, I/O 디바이스에 의한          인터럽트로  주로 발생.

    - 종료 상태 (Terminated): 메모리와 CPU 소유권을 모두 놓고 가는 상태로, 자연스럽게 종료되거나 부모 프로세스가 자          식 프로세스를 강제시키닌 종료로 구분.

프로세스 상태

- 프로세스의 메모리 구조

위에서부터 스택, 힙, 데ㅔ이터 영역, 코드 영역을 구분, 스택은 위 주소부터 할당되고 힙은 아래 주소부터 할당

    - 스택: 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 동적인 특징을 가짐, 함수가 재귀적으로 호          출되면 동적으로 크기가 늘어나는데 이때 힙과 스택의 메모리 영역이 겹치면 안되므로 힙과 스택 사이의 공간을 비움

    - : 동적 할당할 때 사용되며 런타임 시 크기가 결정, 벡터와 같이 동적인 배열이 사용됨

    - 데이터 영역: 전역변수, 정적 변수가 저장, 정적인 특징을 가져 프로그램이 종료되면 사라지는 변수가 들어있는 영역.          데이터 영역은 BSS 영역과 Data 영역으로 나뉘는데, BSS는 초기화되지 않은 변수가 0으로 초기화되어 저장되고                Data 영역은 0이 아닌 다른 값으로 할당된 변수들이 저장됨.

    - 코드 영역: 프로그램에 내장되어 있는 소스 코드가 들어가는 영역으로, 수정이 불가능한 기계어로 저장되어 있으며 정        적인 특징.

프로세스 메모리 구조

- 스레드

스레드는 프로세스의 실행 가능한 가장 작은 단위로, 프로세스는 여러 스레드를 가질 수 있다.

    - 멀티 스레딩: 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법으로, 스레드끼리 자원을 공유하므로        효율성이 높다. 하지만 한 스레드가 문제가 생기면 다른 스레드에 영향을 끼쳐 스레드로 이루어진 프로세스에 영향을          줄 수 있다.

 

- 공유 자원

공유 자원은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 파일, 데이터 등의 자원이나 변수 등을 의미, 하나의 공유 자원을 2개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태 (race condition)이라고 하는데 동시에 접근할 때 순서나 타이밍 등으로 인해 결과값에 영향을 줄 수 있다.

 

- 임계 영역

임계 영역은 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역으로, 이를 해결하기 위한 방법은 뮤텍스, 세마포어, 모니터 3가지가 있다. 모두  잠금(Lock) 메커니즘을 토대로 한다.

    - 뮤텍스 (Mutex): 공유자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금으로, 잠금이 설정되면 다른 스레드는        잠긴 코드 영역에 접근 불가, 상태는 잠금 또는 잠금 해제만 가짐

    - 세마포어 (Semaphore): 일반화된 뮤텍스로, 간단한 정수 값과 두가지 함수 (wait -> 자신 차례가 올 때까지 대기하는          함수, signal -> 다음 프로세스로 순서를 넘기는 함수)로 공유 자원에 대한 접근 처리 

    - 모니터: 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해        인터페이스만 제공, 모니터는 세마포어보다 구현하기 쉽고 상호 배제가 자동인 반면, 세마포어에서는 상호 배제를 명          시적으로 구현해야 하는 차이가 있다.

 

 

- 교착 상태 (DeadLock)

교착상태는 2개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태.

    - 교착상타의 원인

        - 상호배제: 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근 불가능

        - 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태

        - 비선점: 다른 프로세스의 자원을 강제적으로 가져올 수 없는 상태

        - 환형 대기: 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하며 서로가 서로            의 자원을 요구하는 상황

 

- CPU 스케줄링 알고리즘

    - 비선점형 방식: 프로세스가 스스로 CPU 소유권을 포기하는 방식으로, 컨텍스트 스위칭으로 인한 부하가 적음

        - FCFS (First Come, First Served): 가장 먼저 온 것을 가장 먼저 처리, 길게 수행되는 프로세스로 인해 준비 큐에서            오래 기다리는 현상이 발생

        - SJF (Shortest Job First): 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행, 긴 시간을 가진 프로세스가 실행되지            않는 기아 상태 발생

        - 우선순위: 오래된 작업일수록 우선순위를 높이는 방법을 추가함으로써 SJF의 기아 상태 예방

 

    - 선점형 방식: 현대 운영체제가 사용하는 방식으로, 강제로 프로세스를 중단하고 다른 프로세스에 CPU를 할당

        - 라운드 로빈 (RR): 현대 컴퓨터가 쓰는 스케줄링인 우선순위 스케줄링의 일종으로 각 프로세스는 동일한 할당 시간            을 주고 끝나지 않을 경우 다시 준비 큐의 뒤로 이동

        - SRF: SJF와 다르게 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중단하고 해당 프로세스를 수행

        - 다단계 큐: 우선순위에 따른 준비 큐를 여러 개 사용하고, 큐마다 RR이나 FCFS 등 다른 스케줄링 알고리즘을 적용,            큐 간 프로세스 이동이 안되므로 스케줄링 부담은 적지만 유연성은 떨어짐


다음은 알고리즘 풀이를 살펴봅시다~!

 

* 순차 탐색: 앞에서부터 데이터를 하나씩 차례대로 확인하는 탐색 방법

 

def sequential_search(n, target, array):
	for i in range(n):
    	if array[i]== target:
        	return i+1 #현재 위치 반환(인덱스는 0부터 시작하므로 1 더하기)
print("원소개수와 찾고자 하는 문자열을 입력하세요 (ex: 5, hi)")
input_data = input().split()
n = int(input_data[0])
target = input_data[1]

print("원소 개수만큼 문자열을 입력하세요 (ex: hi, hello, bye, good, yeah"))
array = input().split()

# 원소의 인덱스 반환
print(sequential_search(n,target,array)

 


* 이진 탐색: 범위를 반씩 좁혀가는 탐색 방법

  • 반복문 구현
# n , target
n,target = map(int,input().split()) #원소의 개수와 , 타겟 넘버
num = list(map(int,input().split())) #원소 리스트

ans=0
start = 0
end = len(num)-1
while(start<=end):
    print(start,end)
    mid = (start+end)//2
    ans+=1 					#이진탐색 수행 횟수 
    if num[mid] == target:
        print(ans)
        break
    else:
        if num[mid]>target:
            end = mid-1
        else:
            start= mid+1
  • 재귀함수 구현
# n , target

n,target = map(int,input().split())
num = list(map(int,input().split()))
ans = 0

start = 0
end = len(num)-1
def binary_search(target,start,end):
    global ans
    mid = (start+end)//2
    ans+=1
    if start>end:
        return None
    elif num[mid] ==target:
        return ans
    else:
        if num[mid] > target:
            return binary_search(target,start,mid-1)
        else:
            return binary_search(target,mid+1,end)

print(binary_search(target,start,end))

  • 여기서 return 으로 헷갈렸던 부분

return binary_search(target,start,mid-1) 으로 해줘야됐던걸 처음엔
binary_search(target,start,mid-1) 으로만 해줬는데 결과가 None으로 출력됐었다.

return을 통해 함수의 실행을 끝내고 새로운 binary_search 로 들어가야하는 것이였음.


* 이코테 DP 문제 풀이

[개미전사 문제]

문제 설명

  • 개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 합니다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있습니다.
  • 각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 선택적으로 약탈하여 식량을 빼앗을 예정입니다. 이때 메뚜기 정찰병들은 일지선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있습니다.
  • 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 합니다.

예시)

  • 이때 개미 전사는 두 번째 식량창고와 네 번째 식량창고를 선택했을 때 최댓값인 총 8개의 식량을 빼앗을 수 있습니다. 개미 전사는 식량창고가 이렇게 일직선상일 때 최대한 많은 식량을 얻기를 윈합니다.
  • 개미전사를 위해 식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램을 작성하시오.

 

입력 조건

  1. 첫째 줄에 식량창고의 개수 N이 주어집니다. ()
  2. 둘째 줄에 공백을 기준으로 각 식량창고에 저장된 식량의 개수 K가 주어집니다. (0≤K≤1,000)

 

출력 조건

  • 첫째 줄에 개미 전사가 얻을 수 있는 식량의 최댓값을 출력하세요.

 

입력 예시 및 출력

  • 입력 예시:
    4
    1 3 1 5
  • 출력 예시:
    8

[개미전사 풀이]

n = int(input())
num_list = list(map(int,input().split()))

dp=[0] * n
dp[0] = num_list[0]
dp[1] = max(num_list[0],num_list[1])

for i in range(2,n):
    dp[i] = max(dp[i-1],dp[i-2]+num_list[i])

print(dp[n-1])

👊 코드리뷰 & 향후일정 👊 

- 이번 기간에는 각자 지원한 기업에 따른 코딩테스트 시험일정과 자격증 준비 및 면접 준비에 집중했었던 시간이었습니다.

- 11월 22일에는 또다른 CS지식과 알고리즘 풀이를 가져오도록 할게요!!

 

취준생 4명의 취뽀를 응원해주세요!

 

이상 모각코-멋쟁이용두리처럼 였습니다! 다음주에 봐요~