컴퓨터 분야의 문제 해결 기법
- python을 연모로 쓰는

김 경석 지음;
2017.03.06. 발행 (제일 출판), 437 쪽, ISBN 978-89-6544-030-7

[Title: Book: Problem Solving Techniques in Computer Science using python as a tool
by GIM, Gyeongseog/KIM, Kyongsok, published on Mar. 06, 2017; in Hangeul (Korean)]

- 고침과 바로 잡음 표, 새로 넣은 내용 (errata)
- 이 책을 구하시려면 직접 주문하세요.
. How to order book(s) outside of South Korea:

벼리 (요약/초록, summary/abstract)

이 책은 컴퓨터 분야의 문제 해결 기법을 가르친다. 아직 우리 나라에는 컴퓨터 분야의 문제 해결 기법이 제대로 정립되지 않았고, 또한 교재도 별로 나와 있지 않다. 글쓴이는 7 년 동안 컴퓨터 공학과에서 문제 해결 기법을 강의한 경험을 바탕으로 이 책을 쓰게 되었다.

7 년 동안 많이 생각한 결과, 글쓴이는 컴퓨터 분야의 문제 해결 기법에서는 무엇을 어떻게 가르쳐야 할지 생각이 많이 정리되었다. 컴퓨터로 풀 수 있는 문제를, 일단 종이와 연필만으로 풀어보는 것이다. 그래서 어떻게 해야 하겠다는 절차, 방법 등이 확실해지면 그것을 프로그램으로 옮겨보는 것이다.

문제 해결 기법을 잘 가르치면 학생들의 마음 가짐이 바뀔 수 있다. 우리 나라 교육의 심각한 문제 가운데 하나가 주입식 외우기 중심인데, 학생들 스스로 생각하고 문제 해결 기법을 찾게 하면 생각하는 사람으로 바뀔 수 있다.

이 책에서는 문제 해결 기법의 "도우미"로 python이라는 programming language를 쓴다. 그렇지만 이 책의 목적이 python을 가르치는 게 결코 아니다. python은 문제 해결의 도우미(연모, 도구)일 뿐이다. 문제 해결 기법을 제대로 배우기만 하면, python의 세세한 사항은 몰라도 된다.

7 년 동안의 문제 해결 기법 강의 경험과 강의 자료를 바탕으로 이 책을 만들게 되어 아주 기쁘다. 부디 이 책이 컴퓨터 분야의 문제 해결 기법을 배우는 학생들에게 좋은 길라잡이가 되기를 기대한다.


머리말

2007 년 1 학기에 처음으로 (컴퓨터 분야의) 문제 해결 기법 강의를 맡게 되었다. 그런데 학과 교수들이 스스로 이런 제목의 강의를 하자고 하여 시작한 게 아니라, 밖으로부터 강요에 의해서 문제 해결 기법 강의를 개설하게 되었다. 처음으로 이 과목을 맡기로 한 글쓴이의 마음은 갑갑하였다. 학생 때 이런 제목으로 수업을 받은 적도 없고, 이런 과목에서는 무엇을 어떻게 가르쳐야 하는지 아는 바가 전혀 없었다. 이런 과목 이름을 들어본 적도 없었다. 학과 안 다른 교수와 얘기도 많이 나누었지만 별로 뚜렷한 방안도 방향도 정할 수 없었다.

여기 저기 자료를 닥치는 대로 살펴보았다. 다른 공학 분야의 자료를 보니, 물건을 만드는 그런 분야에서는 문제 해결 기법에서 무엇을 어떻게 다루어야 할지 알 수 있었다. 더욱이 그런 분야는 문제 해결 기법이 참 좋은 강의라는 생각이 들었다. 하지만 컴퓨터 분야에서는 어떻게 해야 할지 전혀 감이 오지 않았다. 나라 안에는 책이나 자료가 거의 없었고, 나라 밖의 영어 자료를 보니 그냥 프로그래밍(programming) 기초를 가르치면서 제목을 문제 해결 기법이라고 해 둔 책이 여러 권 있었다. 전혀 도움이 되지 않았다.

7 년 동안 문제 해결 기법을 강의하면서 많이 생각한 결과, 이제 글쓴이 나름대로는 컴퓨터 분야의 문제 해결 기법에서는 무엇을 어떻게 가르쳐야 할지 생각이 정리되었다. 학생들도 글쓴이의 강의 방식을 좋아하는 것으로 보인다.

문제 해결 기법은 분야에 따라 다른 접근 방식이 필요한데, 글쓴이가 생각하는 컴퓨터 분야의 문제 해결 기법은 이렇다. 컴퓨터로 풀 수 있는 문제를, 일단 종이와 연필만으로 풀어보는 것이다. 그래서 어떻게 해야 하겠다는 절차, 방법 등이 확실해지면 그것을 프로그램으로 옮겨보는 것이다.

문제 해결 기법 강의는 프로그래밍 기초를 가르치는 강의와는 확실히 달라야 하는데, 그냥 프로그래밍 기초를 가르치는 경우가 흔히 있으리라고 본다. 문제 해결 기법을 잘 가르치면 학생들의 마음 가짐이 바뀔 수 있다. 우리 나라 교육의 심각한 문제 가운데 하나가 주입식 외우기 중심인데, 학생들 스스로 생각하고 문제 해결 기법을 찾게 하면 생각하는 사람으로 바뀔 수 있다. 와! 아자!

프로그래밍 기초를 가르칠 때, "이런 문제는 프로그램으로는 이렇게 풀면 된다"라고 보통 가르친다. 그런데 글쓴이는, 주어진 문제를 컴퓨터나 프로그램은 일체 생각하지 말고, 종이와 연필 그리고 여러분의 머리만으로 푼다면 어떻게 풀 것인가를 생각해 보라고 늘 강조한다. 프로그래밍 기초와 문제 해결 기법은 목적과 접근 방법이 처음부터 아주 다르고 따라서 그에 알맞게 다루어야 한다.

이 책에서는 문제 해결 기법의 "도우미"로 python이라는 programming language를 쓴다. 그렇지만 이 책의 목적이 python을 가르치는 게 결코 아니다. python은 문제 해결의 도우미(연모, 도구)일 뿐이다. 문제 해결 기법을 제대로 배우기만 하면, python의 세세한 사항은 몰라도 된다. python을 제대로 그리고 상세히 배우고 싶으면 이 책이 아니라 python 책을 읽어야 한다.

사람들을 만났을 때 교수라고 말하면 “한 주에 수업 몇 시간 이예요?”라고 많이들 묻는다. “9 시간”이라고 하면, 거의 모두들 “와! 부러워요”라고 한다. 9 시간 수업만 하고 다른 일을 안 한다면 정말 시간 여유가 많을 것이다. 교수는 수업 준비 부담도 초중고 교사보다는 크고, 대학원생 지도와 연구에도 시간이 많이 들어간다. 또한 글쓴이의 경우 직장과 집이 나누어지지 않는다는 큰 문제가 있다. 집에 와서도 계속 학교 일을 하며, 밤 늦게까지 그리고 주말에도 학교 일을 많이 한다.

그러다 보니 아내 임 윤경과 두 딸에게 미안할 때가 많았다. 특히 두 딸 해솔이와 두리가 어릴 때는 더 그러했다. 잘 커준 두 딸이 고맙다. 수십 년 동안 그런 바쁜 생활을 함께한 아내에게도 고마움을 느낀다.

7 년 동안의 문제 해결 기법 강의 경험과 강의 자료를 바탕으로 이 책을 만들게 되어 아주 기쁘다. 부디 이 책이 컴퓨터 분야의 문제 해결 기법을 배우는 학생들에게 좋은 길라잡이가 되기를 기대한다.

2014.2.13.목 (단기 4347), 금샘 기슭에서, 지은이 김 경석 씀


머리말 (2 판)

2014 년에 이 책 1 판을 낸 뒤 강의하면서 알게 된, 조금 잘못된 부분들을 책 전반적으로 바로잡았고, 또한 강의하기에 좋도록 프로그램들을 가르치는 차례도 여러 군데 바꾸었다. 특히 5 장은 아주 많이 바꾸었다.

2016.02.16.화. (단기 4349), 금샘 기슭에서, 지은이 김 경석 씀


* 책에서 틀린 부분을 바로잡거나 보완한 내용은 아래 주소에 올려 놓겠다. http://asadal.pnu.kr/~gimgs0/book/
목차 (장, 절 제목만)

머리말	1
줄인 목차 (장 제목만)	3
목차 (장, 절 제목)	4
상세 목차 (장, 절, 세절 제목)	7


제 1 장 문제 해결 기법이란 무엇인가? (Problem Solving Technique)	19
1.1 문제 해결 기법, python, computer	21
1.2 무조건 따라하기	23

제 2 장 python programming 환경: Linux/Unix, Windows	39
2.1 컴퓨터 분야 문제 해결은 수학 문제 풀기가 아니다	41
2.2 Linux에 ssh로 접속하기와 python program 문서 편집하기	42
2.3 간단한 문제 풀어보기	42
2.4 String(문자열, 글자떼)을 나타내는 방식: character code	53

제 3 장 자료 형 (data type): int, float, bool, str	55
3.1 [type10] python 자료 형(data type) 개요와 type ( ) 함수	57
3.2 int (integer), float, bool	58
3.3 변수 이름 짓기와 주소/번지 (address)	64
3.4 문자열 (String)	68
3.5 String Method	79
3.6 함수 (function): def ( ) 명령	87
3.7 연산자의 우선 순위 (precedence): 괄호(묶음)가 없을 때	88

제 4 장 자료 구조 (data structure): List (Array), Tuple, Dictionary	91
4.1 List: [..., ..., ...]	93
4.2 List Method	101
4.3 String과 List 사이를 오가기	107
4.4 Array (List로 Array를 만듦)	109
4.5 투플 (Tuple): (..., ..., ...)	114
4.6 Tuple method	121
4.7 List와 Tuple을 견줌: 꽤 비슷하면서도 꽤 다름	121
4.8 Dictionary: {..., ..., ...}	124
4.9 [dic40] Dictionary Method	126

제 5 장 파일 (file) 읽기(read, input)와 쓰기 (write, output)	131
5.1 input(), raw_input() 명령으로 자판(또는 sysin)에서 읽기	133
5.2 읽은 문자열에서 특정 글자를 다른 글자로 바꾸기	138
5.3 간단한 파일 읽기: 자판에서 읽기	140
5.4 간단한 파일 읽기: 디스크 파일에서 읽기	145
5.5 파일에서 읽어서 파일을 새로 만들기	149
5.6 format string을 써서 print 하기	155

제 6 장 if, for loop, while loop 문장	159
6.1 if 명령	161
6.2 for loop 문장	171
6.3 while loop 문장	185

제 7 장 GUI(Graphical User Interface)와 Tkinter	193
7.1 Tkinter로 아주 간단한 프로그램 만들어보기	195
7.2 Label (딱지) 만들기	198
7.3 단추 (Button) 만들기	202
7.4 갈매기 단추 (Checkbutton) 만들기	208
7.5 라디오 단추 (Radiobutton) 만들기	211

제 8 장 Event와 callback function	221
8.1 Frame, pack(), grid()	223
8.2 [bgfg10] font, bg, fg parameter	227
8.3 Entry widget	228
8.4 [calc30] 손 계산기 (Calculator) 만들기	231

제 9 장 합계, 평균, 최대 값, 최소 값 구하기	235
9.1 합계(sum)와 평균(average) 구하기	237
9.2 최대 값(max)과 최소 값(min) 구하기	249
9.3 파일이 열리지 않을 때, 그 원인은?	258
9.4 숙제 보기	260

제 10 장 문자열 (character string), 정렬 (sorting)	261
10.1 len (str1), substring str1[n1:n2+1]	263
10.2 palindrome (좌우 대칭인 문자열)	268
10.3 문자열 (character string) 다루기	285
10.4 ASCII 표, chr() 함수와 ord() 함수	293
10.5 정렬하기 (sort): 오름 차순으로 간추린다	297

제 11 장 Random Number와 Monte Carlo 정적분	309
11.1 진짜 난수와 pseudo (가짜?) 난수	311
11.2 난수를 활용하는 보기	312
11.3 난수를 써서 Monte Carlo 방식 정적분 하기: 기본	323
11.4 난수를 써서 Monte Carlo 방식 정적분 하기: 중급	330
11.5 숙제 보기	350

제 12 장 login (signon) ID와 암호 확인하기	353
12.1 ID와 비밀 번호로 하는 로그인 시도 다루기	355

제 13 장 진법 바꾸기, bit 연산, 함수, 변수의 범위	363
13.1 진법 바꾸기	365
13.2 빗 (bit) 연산	376
13.3 함수 (Function)	387
13.4 변수의 범위 (scope)	392
13.5 그 밖의 사항	395

제 14 장 참고 자료	397
14.1 짤막한 Linux 사용 길라잡이 (quick ref.)	399
14.2 짤막한 Xshell 5 사용 길라잡이 (quick ref.)	409
14.3 짤막한 npp (notepad++) 사용 길라잡이 (quick ref.)	412
14.4 짤막한 Xmanager 5 사용 길라잡이 (quick ref.)	421
14.5 짤막한 Xftp 5 길라잡이 (quick ref.)	425
14.6 짤막한 nano 문서 편집기 사용 길라잡이 (quick ref.)	426
14.7 문서 편집 프로그램과 한글 쓰기 길라잡이 (quick ref.)	427

찾아보기 (index)	430