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