SlideShare uma empresa Scribd logo
1 de 79
생각하는 프로그래밍 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( inti=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.  잘되는군… 멈췄군…
프로그래밍에서의 사소한 문제 왜 멈췄을까 디버깅 해볼까? F5
프로그래밍에서의 사소한 문제 왜 멈췄을까 디버깅 해볼까? F5 F5 F5 . . .
프로그래밍에서의 사소한 문제 . . .
프로그래밍에서의 사소한 문제 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들을 하나씩 삽입해 봅시다. 프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제 ,[object Object],[object Object]
전 여기까지 오면서 	[5 20]  [5 30]  [5 40]  [2 -5] 따위의 입력을 수십 번도 넘게  손으로 쳤습니다. 프로그래밍에서의 사소한 문제
테스트 역시 자동화를 시켜봅니다. 프로그래밍에서의 사소한 문제 s는 이진탐색 함수 호출 assert가 발생하지 않은 걸보니 안전한가봅니다!
같은 숫자로 이뤄진 배열도 안전한가요?? 프로그래밍에서의 사소한 문제 assert가 발생하지 않은 걸보니 안전한가봅니다!
안전성은 확보한 것 같습니다!  그럼 이제 수행시간을 측정해 봅시다! 프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제
프로그래밍에서의 사소한 문제 핵심 스캐폴딩 프로그램 동작과는 관계 없는 개발자용 코드
프로그래밍에서의 사소한 문제 핵심 코딩 4장의 의사코드를 실제 코드로 만드는 과정
프로그래밍에서의 사소한 문제 핵심 테스팅 시간 측정
결론 문제점 인식하기 알고리즘 선택하기 데이터 구조화 하기 프로그램 구조에 대하여 프로그래밍에서의 사소한 문제
결론 연습, 습관이 필요한 것 같습니다. PT로 느낄 수 없는 무언가가 책엔 있다. 책 꼭 한번 읽어보시길 추천..
QnA
참고자료 민근형님 이야기 생각하는 프로그래밍 도서
감사합니다.
생각하는 프로그래밍 1부

Mais conteúdo relacionado

Semelhante a 생각하는 프로그래밍 1부

코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.ultrasuperrok
 
세미나
세미나세미나
세미나Dongyi Kim
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7KoChungWook
 
Machine Learning with Apache Spark and Zeppelin
Machine Learning with Apache Spark and ZeppelinMachine Learning with Apache Spark and Zeppelin
Machine Learning with Apache Spark and ZeppelinDataya Nolja
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XpressEngine
 
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Taejun Kim
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
Python을 활용한 챗봇 서비스 개발 2일차
Python을 활용한 챗봇 서비스 개발 2일차Python을 활용한 챗봇 서비스 개발 2일차
Python을 활용한 챗봇 서비스 개발 2일차Taekyung Han
 
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)Sangsu Song
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별Han-Byul Jeon
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1Jinkyoung Kim
 
프로그래머의 뇌
프로그래머의 뇌프로그래머의 뇌
프로그래머의 뇌규영 허
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 

Semelhante a 생각하는 프로그래밍 1부 (20)

코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
 
세미나
세미나세미나
세미나
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
Machine Learning with Apache Spark and Zeppelin
Machine Learning with Apache Spark and ZeppelinMachine Learning with Apache Spark and Zeppelin
Machine Learning with Apache Spark and Zeppelin
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
 
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
 
System+os study 1
System+os study 1System+os study 1
System+os study 1
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
Python을 활용한 챗봇 서비스 개발 2일차
Python을 활용한 챗봇 서비스 개발 2일차Python을 활용한 챗봇 서비스 개발 2일차
Python을 활용한 챗봇 서비스 개발 2일차
 
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
 
프로그래머의 뇌
프로그래머의 뇌프로그래머의 뇌
프로그래머의 뇌
 
리팩토링
리팩토링리팩토링
리팩토링
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 

생각하는 프로그래밍 1부