79
생생생생 생생생생생 1 생 DevRookie 생생생생 생생생

생각하는 프로그래밍 1부

  • Upload
    sj-k

  • View
    1.380

  • Download
    3

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 생각하는 프로그래밍 1부

생각하는 프로그래밍 1 부DevRookie

프로모션권승진

Page 2: 생각하는 프로그래밍 1부

목차• 문제점 인식하기• 알고리즘 선택하기• 데이터 구조화 하기• 프로그램 구조에 대하여• 프로그래밍에서의 사소한 문제

Page 3: 생각하는 프로그래밍 1부

문제점 인식하기

Page 4: 생각하는 프로그래밍 1부

문제점 인식하기

• 어떤 의문이 주어졌을 때 그것을 분석하고 파악하는 방법

• 문제점을 재대로 파악했을 경우의 좋은 예

Page 5: 생각하는 프로그래밍 1부

문제점 인식하기

• 디스크 파일을 어떻게 정렬할까 ?하는 의문에서 시작

Page 6: 생각하는 프로그래밍 1부

문제점 인식하기• 대화– A : 정렬 하려는 것이 정확히 뭐지 ? 레코드가

얼마나 많고 , 형식이 어떻지 ?

– B : 최대 1 천만 개의 레코드를 가지고 각각의 레코드는 7 자리 정수야 . 숫자는 중복되지 않고 ,그리고 메모리는 1MB 정도 사용할 수 있어 .

Page 7: 생각하는 프로그래밍 1부

문제점 인식하기• 입력 : 최대 n 개의 양의 정수들만을 포함하는 파일

로 , 각 숫자는 n 보다 작고 n = 10 의 7 승이다 . 어떤 숫자가 두번 이상 나오는 것은 치명적 에러이다 .

• 출력 : 입력된 정수를 오름차순으로 정렬한 리스트

• 조건 : 메모리 1MB 가량 사용가능

Page 8: 생각하는 프로그래밍 1부

문제점 인식하기

• 해결 방법을 강구해보자 .해결방법 1.

– 입력 파일을 읽어서 작업파일에 저장한다 .– 작업 파일을 토대로 디스크 기반의 머지정렬을 한다 .

Page 9: 생각하는 프로그래밍 1부

문제점 인식하기

• 문제를 좀 더 곰곰히 생각해보자 .• 단위가 32bit 의 정수형 한 개다 .• 대략 1MB 에 250,000 개를 올릴 수 있겠군 .

Page 10: 생각하는 프로그래밍 1부

문제점 인식하기

• 다시 해결 방법을 강구해보자 .해결방법 2.

– 250,000 개를 읽어서 메모리에서 정렬– 을 40 번 반복한다 .

Page 11: 생각하는 프로그래밍 1부

문제점 인식하기

• 문제를 더 곰곰히 생각해본다 .• 숫자가 두 개 이상 나오지 않는다 .• 1~10^7 중에 특정 숫자가 존재 하는지

안 하는지만 구별해놓으면 된다 .

Page 12: 생각하는 프로그래밍 1부

문제점 인식하기

• 다시 해결 방법을 강구해보자 .해결방법 3.

– 비트 천만 개의 열로 나타내 본다 .– { 1, 2, 3, 5, 8, 12, 13}– 0 1 1 1 0 1 0 0 1 0 0 0 1 1 ……

Page 13: 생각하는 프로그래밍 1부

문제점 인식하기

Page 14: 생각하는 프로그래밍 1부

문제점 인식하기• 핵심– 정확한 문제 정의

• 작은 문제에 대한 주의 깊은 분석으로 이익을 얻어보자 .

– 시간 - 공간 트레이드오프인 것과 아닌 것• 시간과 공간은 보통 반비례하지만 , 공간이 줄어들

수록 시간도 주는 경우가 빈번하다 .

– 단순한 디자인• 간단한 프로그램일수록 신뢰 , 안전 , 견고적이며

유지보수가 쉽다 .

Page 15: 생각하는 프로그래밍 1부

알고리즘 선택하기

Page 16: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 어려워보이는 문제지만 간단하면서도 기대하지 않았던 솔루션이 있다 .

• 코딩 하기 전 , 하는 중 , 한 후에 진지하게 생각하려 한다면 누구나 얻을 수 있는 영감

Page 17: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 3 가지 문제의 경우에 대해알고리즘 선택이 얼마나 중요한가를 본다 .

Page 18: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 A–최대 40 억 개의 32 비트 정수가 랜덤한 순서로

들어있는 순차적 파일이 주어졌을 때 파일에 포함되지 않은 임의의 정수 하나를 찾아라 .

–메모리를 넉넉히 쓸 경우와 아닌 경우

Page 19: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 A–알고리즘 1• 메모리가 넉넉하면

컬럼 1 과 같은 방법으로 해본다 .• 500 메가 메모리로 해결된다 .

Page 20: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 A–알고리즘 2• 순차 탐색을 해본다 .• n 번의 탐색 내에서 찾을 수 있다 .

Page 21: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 A–알고리즘 3• 이진 탐색을 해본다 .• log2N 안에서 찾을 수 있다 .

Page 22: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 B– n 개의 원소를 가지는 1 차원 벡터를 i 만큼 왼쪽으로

회전시켜라 .– 예 )

• n = 8 , i =3 일때– abcdefgh -> defghabc

– 메모리가 수십바이트 여유 밖에 없다 .

Page 23: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 B• 가장 쉬운 방법

Page 24: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 B• 저글링 기법

Page 25: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 B• 반전 알고리즘• a’b -> a’b’ -> (a’b’)’ == ba

Page 26: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 C–주어진 영단어 사전에서 전철어구 집합 찾기• 예 )

– pots -> stop, tops

Page 27: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 C–알고리즘 1• 어떤 단어의 모든 문자의 순열을 고려해본다 .

– 22 글자의 단어의 전철어구 찾는데 걸리는 시간은 22!– 22! 개의 단어와 사전의 비교

Page 28: 생각하는 프로그래밍 1부

알고리즘 선택하기

• 문제 C– 알고리즘 2

• 사전자료를 다르게 생각해보자 .• 사전의 모든 단어를 알파벳 순으로 정렬한다 .

– deposit -> deiopst – dopiest -> deiopst

• 사전을 정렬한다 .

Page 29: 생각하는 프로그래밍 1부

알고리즘 선택하기• 핵심–정렬–탐색–표시–문제정의–문제 해결자의 관점

Page 30: 생각하는 프로그래밍 1부

데이터 구조화 하기

Page 31: 생각하는 프로그래밍 1부

데이터 구조화 하기

• 내부 데이터 구조 바꿈으로서 –더 간결하고–더 좋게 만들 수 있었던 경우

Page 32: 생각하는 프로그래밍 1부

데이터 구조화 하기if( k == 1) c001++;if( k == 2) c002++;

….if( k == 500) c500++;

Page 33: 생각하는 프로그래밍 1부

데이터 구조화 하기

for( int i=0; i<500; i++){

if( k == i) c[i]++;}

Page 34: 생각하는 프로그래밍 1부

데이터 구조화 하기

• 폼 레터 프로그래밍

Page 35: 생각하는 프로그래밍 1부

데이터 구조화

지저분한 시스템

에러 메시지가 코드 여기 저기에 흩어져 있고 ,

다른 출력문과 섞여있다 .

깔끔한 시스템

하나의 함수를 통해 에러 메시지에 접근하도록 한다 .

에러 메시지 이야기

Page 36: 생각하는 프로그래밍 1부

데이터 구조화

지저분한 시스템

에러 메시지가 코드 여기 저기에 흩어져 있고 ,

다른 출력문과 섞여있다 .

깔끔한 시스템

하나의 함수를 통해 에러 메시지에 접근하도록 한다 .

에러 메시지 이야기

모든 가능한 에러 메시지에 대한 리스트를 만드시오 .

모든 “심각한” 에러 메시지에 대해 경고음을 발생하시오 .

에러 메시지를 프랑스어로 번역하시오 .

Page 37: 생각하는 프로그래밍 1부

데이터 구조화• 특화된 데이터를 위한 강력한 도구들– Hyper Text– Name-Value Pairs– Spread Sheet– DataBase

Page 38: 생각하는 프로그래밍 1부

데이터 구조화• 데이터 구조화의 이득–실행 시간 감소–메모리 사용량 감소–포팅과 유지보수의 쉬움

Page 39: 생각하는 프로그래밍 1부

데이터 구조화• 핵심–반복 되는 코드는 배열을 사용하여 다시 작업–복잡한 구조는 캡슐화–도구를 사용하라–코드 작성 전에 데이터 구조 파악에 힘쓰자 .

Page 40: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 41: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

• 문제 – 정렬된 배열 x[0..n-1] 이 목표 t 를 포함하는가 ?

• 조건– n>= 0 이고 , x[0] <= x[1] …. <=x[n]– n=0 이면 빈 배열– 정답은 t 가 있는 위치 p (t=x[p], x 안에 t 가 없으면 p=-1)

Page 42: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

• 이진 탐색을 활용하면 될 것 같다 .• 의사 코드를 작성해보자 .

Page 43: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 44: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 45: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 46: 생각하는 프로그래밍 1부

프로그램 구조에 대하여• 코드 검증–코드의 정확성에 대한 확신을 위한 검증–단정문을 사용해서 ..

Page 47: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 48: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

Page 49: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

• 상세한 경우 이렇게 까지 하지만 조금 느슨하게 해도 관계 없다 .

Page 50: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

• 핵심 – 단정문이라는 것– 순차 구조에서– 선택 구조에서– 반복 구조에서– 함수 에서

Page 51: 생각하는 프로그래밍 1부

프로그램 구조에 대하여

• 검증의 역할–버그의 위치–다른 버그를 만들지 않으면서 버그 수정

Page 52: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

Page 53: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 문제 인식• 알고리즘과 데이터 구조를 선택했다 .• 가상 코드를 만들었다 .

• 남은 것은 ??

Page 54: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

• 알고리즘과 데이터 구조를 선택했다 .• 가상 구조를 만들었다 .

• 남은 것은 ??실제 구현

Page 55: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

스타일에 따라 서로 다른 무수한 코드들이 나올 수 있다 .

Page 56: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

테스트 케이스들을 만들어봅니다 .

Page 57: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제1. 잘되는군 ..

2. 잘되는군…

3. 멈췄군…

Page 58: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 왜 멈췄을까 디버깅 해볼까 ?

F5

Page 59: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 왜 멈췄을까 디버깅 해볼까 ?

F5

F5

F5...

Page 60: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

.

.

.

Page 61: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제1. 0 10 20 있는 배열에서 0 을 찾아봤다 .

x[0] 에 있다는군…

2. 0 10 20 30 40 있는 배열에서 20 을 찾아봤다 .x[2] 에 있다는군…

3. 0 10 20 있는 배열에서 -5 를 찾아봤다 .없군 ..

Page 62: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제1. 0 10 20 있는 배열에서 0 을 찾아봤다 .

x[0] 에 있다는군…

2. 0 10 20 30 40 있는 배열에서 20 을 찾아봤다 .x[2] 에 있다는군…

3. 0 10 20 있는 배열에서 -5 를 찾아봤다 .없군 ..

일단은 잘 동작하는듯 보입니다 !

Page 63: 생각하는 프로그래밍 1부

• 그럼 Column 4 에서 봤던 mustbe 들을 하나씩 삽입해 봅시다 .

프로그래밍에서의 사소한 문제

Page 64: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

Page 65: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

• 값이 없을 경우

Page 66: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

• 이러한 mustbe 들을 잘 정의해서 지켜졌다면 프로그램은 안전하다 .

Page 67: 생각하는 프로그래밍 1부

• 전 여기까지 오면서 [5 20] [5 30] [5 40] [2 -5] 따위의 입력을 수십 번도 넘게 손으로 쳤습니다 .

프로그래밍에서의 사소한 문제

Page 68: 생각하는 프로그래밍 1부

• 테스트 역시 자동화를 시켜봅니다 .

프로그래밍에서의 사소한 문제

assert 가 발생하지 않은 걸보니 안전한가봅니다 !

s 는 이진탐색 함수 호출

Page 69: 생각하는 프로그래밍 1부

• 같은 숫자로 이뤄진 배열도 안전한가요 ??

프로그래밍에서의 사소한 문제

assert 가 발생하지 않은 걸보니 안전한가봅니다 !

Page 70: 생각하는 프로그래밍 1부

• 안전성은 확보한 것 같습니다 ! 그럼 이제 수행시간을 측정해 봅시다 !

프로그래밍에서의 사소한 문제

Page 71: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제

Page 72: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 핵심–스캐폴딩• 프로그램 동작과는 관계 없는 개발자용 코드

Page 73: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 핵심–코딩– 4 장의 의사코드를 실제 코드로 만드는 과정

Page 74: 생각하는 프로그래밍 1부

프로그래밍에서의 사소한 문제• 핵심–테스팅–시간 측정

Page 75: 생각하는 프로그래밍 1부

결론• 문제점 인식하기• 알고리즘 선택하기• 데이터 구조화 하기• 프로그램 구조에 대하여• 프로그래밍에서의 사소한 문제

Page 76: 생각하는 프로그래밍 1부

결론• 연습 , 습관이 필요한 것 같습니다 .

• PT 로 느낄 수 없는 무언가가 책엔 있다 .

• 책 꼭 한번 읽어보시길 추천 ..

Page 77: 생각하는 프로그래밍 1부

QnA

Page 78: 생각하는 프로그래밍 1부

참고자료

• 민근형님 이야기

• 생각하는 프로그래밍 도서

Page 79: 생각하는 프로그래밍 1부

감사합니다 .