생각하는 프로그래밍 1부DevRookie프로모션권승진
목차문제점 인식하기알고리즘 선택하기데이터 구조화 하기프로그램 구조에 대하여프로그래밍에서의 사소한 문제
문제점 인식하기
문제점 인식하기어떤 의문이 주어졌을 때 그것을 분석하고 파악하는 방법문제점을 재대로 파악했을 경우의 좋은 예
문제점 인식하기디스크 파일을 어떻게 정렬할까?하는 의문에서 시작
문제점 인식하기대화A : 정렬 하려는 것이 정확히 뭐지? 레코드가 얼마나 많고, 형식이 어떻지?B : 최대 1천만 개의 레코드를 가지고 각각의 레코드는 7자리 정수야. 숫자는 중복되지 않고,그리고 메모리는 1MB정도 사용할 수 있어.
문제점 인식하기입력 : 최대 n개의 양의 정수들만을 포함하는 파일로, 각 숫자는 n보다 작고 n = 10의 7승이다. 어떤 숫자가 두번 이상 나오는 것은 치명적 에러이다.출력 : 입력된 정수를 오름차순으로 정렬한 리스트조건 : 메모리 1MB가량 사용가능
문제점 인식하기해결 방법을 강구해보자.해결방법 1.입력 파일을 읽어서 작업파일에 저장한다.작업 파일을 토대로 디스크 기반의 머지정렬을 한다.
문제점 인식하기문제를 좀 더 곰곰히 생각해보자.단위가 32bit의 정수형 한 개다.대략 1MB에 250,000개를 올릴 수 있겠군.
문제점 인식하기다시 해결 방법을 강구해보자.해결방법 2.250,000개를 읽어서 메모리에서 정렬을 40번 반복한다.
문제점 인식하기문제를 더 곰곰히 생각해본다.숫자가 두 개 이상 나오지 않는다.1~10^7중에 특정 숫자가 존재 하는지 안 하는지만 구별해놓으면 된다.
문제점 인식하기다시 해결 방법을 강구해보자.해결방법 3.비트 천만 개의 열로 나타내 본다.{ 1, 2, 3, 5, 8, 12, 13}0 1 1 1 0 1 0 0 1 0 0 0 1 1 ……
문제점 인식하기
문제점 인식하기핵심정확한 문제 정의작은 문제에 대한 주의 깊은 분석으로 이익을 얻어보자.시간-공간 트레이드오프인 것과 아닌 것시간과 공간은 보통 반비례하지만, 공간이 줄어들 수록 시간도 주는 경우가 빈번하다.단순한 디자인간단한 프로그램일수록 신뢰, 안전, 견고적이며 유지보수가 쉽다.
알고리즘 선택하기
알고리즘 선택하기어려워보이는 문제지만 간단하면서도 기대하지 않았던 솔루션이 있다.코딩 하기 전, 하는 중, 한 후에 진지하게 생각하려 한다면 누구나 얻을 수 있는 영감
알고리즘 선택하기3가지 문제의 경우에 대해알고리즘 선택이 얼마나 중요한가를 본다.
알고리즘 선택하기문제 A최대 40억 개의 32비트 정수가 랜덤한 순서로 들어있는 순차적 파일이 주어졌을 때 파일에 포함되지 않은 임의의 정수 하나를 찾아라.메모리를 넉넉히 쓸 경우와 아닌 경우
알고리즘 선택하기문제 A알고리즘 1메모리가 넉넉하면컬럼1과 같은 방법으로 해본다.500메가 메모리로 해결된다.
알고리즘 선택하기문제 A알고리즘 2순차 탐색을 해본다.n번의 탐색 내에서 찾을 수 있다.
알고리즘 선택하기문제 A알고리즘 3이진 탐색을 해본다.log2N 안에서 찾을 수 있다.
알고리즘 선택하기문제 Bn개의 원소를 가지는 1차원 벡터를 i만큼 왼쪽으로 회전시켜라.예)n = 8 ,  i =3 일때abcdefgh           ->        defghabc메모리가 수십바이트 여유 밖에 없다.
알고리즘 선택하기문제 B가장 쉬운 방법
알고리즘 선택하기문제 B저글링 기법
알고리즘 선택하기문제 B반전 알고리즘a’b     ->    a’b’   ->    (a’b’)’  == ba
알고리즘 선택하기문제 C주어진 영단어 사전에서 전철어구 집합 찾기예)pots   -> stop, tops
알고리즘 선택하기문제 C알고리즘 1어떤 단어의 모든 문자의 순열을 고려해본다.22글자의 단어의 전철어구 찾는데 걸리는 시간은 22!22!개의 단어와 사전의 비교
알고리즘 선택하기문제 C알고리즘 2사전자료를 다르게 생각해보자.사전의 모든 단어를 알파벳 순으로 정렬한다.deposit -> deiopstdopiest -> deiopst사전을 정렬한다.
알고리즘 선택하기핵심정렬탐색표시문제정의문제 해결자의 관점
데이터 구조화 하기
데이터 구조화 하기내부 데이터 구조 바꿈으로서더 간결하고더 좋게 만들 수 있었던 경우
데이터 구조화 하기if( k == 1) c001++;if( k == 2) c002++;	….if( k == 500) c500++;
데이터 구조화 하기for( inti=0; i<500; i++){	if( k == i) c[i]++;}
데이터 구조화 하기폼 레터 프로그래밍
데이터 구조화에러 메시지 이야기지저분한 시스템에러 메시지가 코드 여기 저기에 흩어져 있고, 다른 출력문과 섞여있다.깔끔한 시스템하나의 함수를 통해 에러 메시지에 접근하도록 한다.
데이터 구조화모든 가능한 에러 메시지에 대한 리스트를 만드시오.에러 메시지 이야기지저분한 시스템에러 메시지가 코드 여기 저기에 흩어져 있고, 다른 출력문과 섞여있다.깔끔한 시스템하나의 함수를 통해 에러 메시지에 접근하도록 한다.모든 “심각한” 에러 메시지에 대해 경고음을 발생하시오.에러 메시지를 프랑스어로 번역하시오.
데이터 구조화특화된 데이터를 위한 강력한 도구들Hyper TextName-Value PairsSpread SheetDataBase
데이터 구조화데이터 구조화의 이득실행 시간 감소메모리 사용량 감소포팅과 유지보수의 쉬움
데이터 구조화핵심반복 되는 코드는 배열을 사용하여 다시 작업복잡한 구조는 캡슐화도구를 사용하라코드 작성 전에 데이터 구조 파악에 힘쓰자.
프로그램 구조에 대하여
프로그램 구조에 대하여문제 정렬된 배열 x[0..n-1]이 목표 t를 포함하는가?조건n>= 0이고, x[0] <= x[1] …. <=x[n]n=0이면 빈 배열정답은 t가 있는 위치 p      (t=x[p], x안에 t가 없으면 p=-1)
프로그램 구조에 대하여이진 탐색을 활용하면 될 것 같다.의사 코드를 작성해보자.
프로그램 구조에 대하여
프로그램 구조에 대하여
프로그램 구조에 대하여
프로그램 구조에 대하여코드 검증코드의 정확성에 대한 확신을 위한 검증단정문을 사용해서..
프로그램 구조에 대하여
프로그램 구조에 대하여
프로그램 구조에 대하여상세한 경우 이렇게 까지 하지만조금 느슨하게 해도 관계 없다.
프로그램 구조에 대하여핵심 단정문이라는 것순차 구조에서선택 구조에서반복 구조에서함수 에서
프로그램 구조에 대하여검증의 역할버그의 위치다른 버그를 만들지 않으면서 버그 수정
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제문제 인식알고리즘과 데이터 구조를 선택했다.가상 코드를 만들었다.남은 것은??
프로그래밍에서의 사소한 문제알고리즘과 데이터 구조를 선택했다.가상 구조를 만들었다.남은 것은??실제 구현
프로그래밍에서의 사소한 문제스타일에 따라 서로 다른 무수한 코드들이 나올 수 있다.
프로그래밍에서의 사소한 문제테스트 케이스들을 만들어봅니다.
프로그래밍에서의 사소한 문제1.  잘되는군..2.  잘되는군…멈췄군…
프로그래밍에서의 사소한 문제왜 멈췄을까 디버깅 해볼까?F5
프로그래밍에서의 사소한 문제왜 멈췄을까 디버깅 해볼까?F5F5F5...
프로그래밍에서의 사소한 문제...
프로그래밍에서의 사소한 문제1.  0 10 20 있는 배열에서 0을 찾아봤다. 	x[0]에 있다는군…2.  0 10 20 30 40 있는 배열에서 20을 찾아봤다.	x[2]에 있다는군…0 10 20 있는 배열에서 -5를 찾아봤다.없군..
프로그래밍에서의 사소한 문제1.  0 10 20 있는 배열에서 0을 찾아봤다. 	x[0]에 있다는군…2.  0 10 20 30 40 있는 배열에서 20을 찾아봤다.	x[2]에 있다는군…0 10 20 있는 배열에서 -5를 찾아봤다.없군..일단은 잘 동작하는듯 보입니다!
그럼 Column 4에서 봤던 mustbe들을 하나씩 삽입해 봅시다.프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제 값이 없을 경우프로그래밍에서의 사소한 문제이러한 mustbe들을 잘 정의해서 지켜졌다면 프로그램은 안전하다.
전 여기까지 오면서	[5 20]  [5 30]  [5 40]  [2 -5]따위의 입력을 수십 번도 넘게 손으로 쳤습니다.프로그래밍에서의 사소한 문제
테스트 역시 자동화를 시켜봅니다.프로그래밍에서의 사소한 문제s는 이진탐색 함수 호출assert가 발생하지 않은 걸보니 안전한가봅니다!
같은 숫자로 이뤄진 배열도 안전한가요??프로그래밍에서의 사소한 문제assert가 발생하지 않은 걸보니 안전한가봅니다!
안전성은 확보한 것 같습니다! 그럼 이제 수행시간을 측정해 봅시다!프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제핵심스캐폴딩프로그램 동작과는 관계 없는 개발자용 코드
프로그래밍에서의 사소한 문제핵심코딩4장의 의사코드를 실제 코드로 만드는 과정
프로그래밍에서의 사소한 문제핵심테스팅시간 측정
결론문제점 인식하기알고리즘 선택하기데이터 구조화 하기프로그램 구조에 대하여프로그래밍에서의 사소한 문제
결론연습, 습관이 필요한 것 같습니다.PT로 느낄 수 없는 무언가가 책엔 있다.책 꼭 한번 읽어보시길 추천..
QnA
참고자료민근형님 이야기생각하는 프로그래밍 도서
감사합니다.
생각하는 프로그래밍 1부

생각하는 프로그래밍 1부