생각하는 프로그래밍 1부
DESCRIPTION
TRANSCRIPT
생각하는 프로그래밍 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 안에서 찾을 수 있다 .
알고리즘 선택하기
• 문제 B– n 개의 원소를 가지는 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 -> deiopst – dopiest -> deiopst
• 사전을 정렬한다 .
알고리즘 선택하기• 핵심–정렬–탐색–표시–문제정의–문제 해결자의 관점
데이터 구조화 하기
데이터 구조화 하기
• 내부 데이터 구조 바꿈으로서 –더 간결하고–더 좋게 만들 수 있었던 경우
데이터 구조화 하기if( k == 1) c001++;if( k == 2) c002++;
….if( k == 500) c500++;
데이터 구조화 하기
for( int i=0; i<500; i++){
if( k == i) c[i]++;}
데이터 구조화 하기
• 폼 레터 프로그래밍
데이터 구조화
지저분한 시스템
에러 메시지가 코드 여기 저기에 흩어져 있고 ,
다른 출력문과 섞여있다 .
깔끔한 시스템
하나의 함수를 통해 에러 메시지에 접근하도록 한다 .
에러 메시지 이야기
데이터 구조화
지저분한 시스템
에러 메시지가 코드 여기 저기에 흩어져 있고 ,
다른 출력문과 섞여있다 .
깔끔한 시스템
하나의 함수를 통해 에러 메시지에 접근하도록 한다 .
에러 메시지 이야기
모든 가능한 에러 메시지에 대한 리스트를 만드시오 .
모든 “심각한” 에러 메시지에 대해 경고음을 발생하시오 .
에러 메시지를 프랑스어로 번역하시오 .
데이터 구조화• 특화된 데이터를 위한 강력한 도구들– Hyper Text– Name-Value Pairs– Spread Sheet– DataBase
데이터 구조화• 데이터 구조화의 이득–실행 시간 감소–메모리 사용량 감소–포팅과 유지보수의 쉬움
데이터 구조화• 핵심–반복 되는 코드는 배열을 사용하여 다시 작업–복잡한 구조는 캡슐화–도구를 사용하라–코드 작성 전에 데이터 구조 파악에 힘쓰자 .
프로그램 구조에 대하여
프로그램 구조에 대하여
• 문제 – 정렬된 배열 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. 잘되는군…
3. 멈췄군…
프로그래밍에서의 사소한 문제• 왜 멈췄을까 디버깅 해볼까 ?
F5
프로그래밍에서의 사소한 문제• 왜 멈췄을까 디버깅 해볼까 ?
F5
F5
F5...
프로그래밍에서의 사소한 문제
.
.
.
프로그래밍에서의 사소한 문제1. 0 10 20 있는 배열에서 0 을 찾아봤다 .
x[0] 에 있다는군…
2. 0 10 20 30 40 있는 배열에서 20 을 찾아봤다 .x[2] 에 있다는군…
3. 0 10 20 있는 배열에서 -5 를 찾아봤다 .없군 ..
프로그래밍에서의 사소한 문제1. 0 10 20 있는 배열에서 0 을 찾아봤다 .
x[0] 에 있다는군…
2. 0 10 20 30 40 있는 배열에서 20 을 찾아봤다 .x[2] 에 있다는군…
3. 0 10 20 있는 배열에서 -5 를 찾아봤다 .없군 ..
일단은 잘 동작하는듯 보입니다 !
• 그럼 Column 4 에서 봤던 mustbe 들을 하나씩 삽입해 봅시다 .
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
• 값이 없을 경우
프로그래밍에서의 사소한 문제
• 이러한 mustbe 들을 잘 정의해서 지켜졌다면 프로그램은 안전하다 .
• 전 여기까지 오면서 [5 20] [5 30] [5 40] [2 -5] 따위의 입력을 수십 번도 넘게 손으로 쳤습니다 .
프로그래밍에서의 사소한 문제
• 테스트 역시 자동화를 시켜봅니다 .
프로그래밍에서의 사소한 문제
assert 가 발생하지 않은 걸보니 안전한가봅니다 !
s 는 이진탐색 함수 호출
• 같은 숫자로 이뤄진 배열도 안전한가요 ??
프로그래밍에서의 사소한 문제
assert 가 발생하지 않은 걸보니 안전한가봅니다 !
• 안전성은 확보한 것 같습니다 ! 그럼 이제 수행시간을 측정해 봅시다 !
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제• 핵심–스캐폴딩• 프로그램 동작과는 관계 없는 개발자용 코드
프로그래밍에서의 사소한 문제• 핵심–코딩– 4 장의 의사코드를 실제 코드로 만드는 과정
프로그래밍에서의 사소한 문제• 핵심–테스팅–시간 측정
결론• 문제점 인식하기• 알고리즘 선택하기• 데이터 구조화 하기• 프로그램 구조에 대하여• 프로그래밍에서의 사소한 문제
결론• 연습 , 습관이 필요한 것 같습니다 .
• PT 로 느낄 수 없는 무언가가 책엔 있다 .
• 책 꼭 한번 읽어보시길 추천 ..
QnA
참고자료
• 민근형님 이야기
• 생각하는 프로그래밍 도서
감사합니다 .