코딩 테스트를 위한 자료 구조와 알고리즘 with C++ - 67개 문제 풀이로 익히자!
존 캐리.셰리안 도시.파야스 라잔 지음, 황선규 옮김 / 길벗 / 2020년 12월
평점 :
장바구니담기


C++을 C++ 답게 십분 활용할 수 있는 노하우를 얻을 수 있으며, 실무에 중요하게 활용되는 알고리즘을 구현하는 방법을 배울 수 있는 책이다. 장점과 단점을 중심으로 소개해보겠다.


  • 소개하고 싶은 장점 두가지
    크게 두가지의 장점을 언급하고 싶다. 우선 STL의 자료 구조 컨테이너 혹은 템플릿 메타프로그래밍과 같은 C++에 종속적인 기법들을 각 알고리즘 별로 자세히 설명하고 있어 C++의 특성을 잘 전달하고 있다는 점을 들 수 있다.

    C++은 활용 방식에 따라 C언어의 무한에 가까운 자유도와 Python 같은 고수준 언어의 편리함 사이의 미묘한 줄타기 매력을 느낄 수 있다. C언어의 포인터로 고차원 언어들이 지원하지 않는 자유도를 만끽하면서도, Struct와 함수 포인터로 객체지향을 흉내내며 땀 흘린적이 있다면 이 말의 의미를 알 것이다.

    반면 Python으로 어떻게 이 코드가 돌아가냐고 놀랄 때도 있는가 하면 가끔 포인터로 한방에 끝낼 수 있는 것을 빙빙 돌아갈 때 답답함을 느끼기도 한다. 그 적절한 중간 지점의 합리성을 찾는 C++의 매력은 STL이나 템플릿 등을 상황에 따라 잘 다룰 수 있어야 하는데 이 책은 C++14 표준에 맞춰 C++의 매력과 장점을 잘 전달하고 있다.

    또 하나의 장점은 실습 문제와 연습 문제의 질이다. 코딩 테스트용 알고리즘 문제는 알고리즘을 훈련하고 원하는 회사에 취업하기엔 적당하지만 제한된 시간 내 변별력을 목적으로 하고 있어 깊이 있는 문제 혹은 실전에 유용하게 활용될 만한 문제 그리고 큰 숲을 이룰만한 체계성을 가진 문제들이 적은 편이다. 단지 취업의 목적이 아니라 한 단계 넘어선 보다 큰 프로젝트를 다루고 싶다거나 자신의 주체할 수 없는 창의 욕구를 실현하기에 부족한 면이 없지 않다.

    만약 나와 같은 생각을 한 독자 분이라면 본 도서의 예제들이 그런 불만들을 상당 부분 해소시켜 줄 것이다. 책 소개에는 무려 67개의 문제가 등장한다고 하는데 이를 모두 다룰 순 없으므로 소개할 만한 몇가지를 압축하여 보았다.

    첫번째로 소개하고 싶은 문제는 아래 그림과 같이 맵리듀스를 구현하는 문제이다. 맵리듀스는 데이터 과학 분야에서 자주 활용되는 알고리즘으로 하둡 등의 플랫폼에서 자주 활용되는 기술이다.맵리듀스

    분할 정복 알고리즘의 몇몇 코딩 테스트 알고리즘을 풀어보면 문제의 질 때문에 한숨 나온적이 많았다. 적어도 이 예제처럼 분할 정복을 병렬 처리를 위한 목적으로 활용하는 수준의 문제를 풀어야 실무에서 빛을 발휘하지 않을까?

    알고리즘을 설명하고 알고리즘을 구현하는 수준의 문제는 수학으로 따지면 사칙연산의 응용 정도 레벨에 지나지 않는다고 생각한다. 이런 부분이 이 책의 가장 큰 장점이라고 할 수 있겠는데 저자들의 다양한 경험이 축적되어 현업에서 빛을 발할 수 있는 실전적인 문제가 많다는 점을 강조하고 싶다.

    개인적으로는 데이터 과학 분야에 도움이 되는 예제들이 많이 수록되어 있다는 점도 인상깊었다. 이 책의 예제 중 특히 2장 트리, 그래프 파트나 5 ~ 8장에서 다룬 그리디, 그래프, DP 알고리즘의 경우 AI 분야 강화학습 및 데이터 과학 분야에 자주 활용되는 기본 알고리즘이기에 AI를 공부하는 나로써는 많은 도움을 받을 수 있었다.

    두번째 예제는 멜로디 순열 문제이다. 음악 집합 이론을 활용하는데 프로그래밍의 최고 매력은 이렇게 다른 학문과의 접점에서 가장 빛나는 것 같다. 나는 책을 고르기전 반드시 저자의 약력을 살펴보는 편인데 책의 저자 중 한 명인 존캐리의 작곡자이자 피아니스트 경력이 특히 눈에 띄였다. 아마도 이 문제는 존캐리가 낸 문제가 아닐까 싶다.멜로디

    프로그래밍은 현실을 대변하기도 하고 현실의 문제를 풀어주는데 그 가치가 있다. 즉, 어느 실무 분야에 접목되더라도 그 분야의 도메인 지식을 정확하고 빠르게 이해하여 사람을 돕는 프로그램을 만들줄 알아야 프로그래머로써의 가치가 빛날 것이기에 이런 신선한 문제에 많은 고마움을 느낄 수 있었다. 풀어보면 음악의 깊은 세계를 IT로 느낄 수 있다는 것에 놀라게 될 것이다.

    세번째 예제도 두번째 예제와 맥락이 같다. 최대한 저렴하게 도로를 설계하는 문제인데 그래프의 가중치나 최단 거리를 찾는 알고리즘을 적용하다보면 알고리즘을 어떻게 써야 유용한지 문제 중심의 감각을 익힐 수 있다. 이 역시 네이게이션 최단 경로 안내와 같은 업무 도메인과 결합했을 때 유용하게 활용할 수 있는 예제이다.도로설계

    알고리즘을 모두 잘 이해하고 구현할 수 있다고 해도 현실의 문제를 풀 수 없다면 무슨 소용이겠는가? 이 책은 이런 알고리즘과 현실의 가교 역할을 톡톡히 해낸다는 점이 매력이라 할 수 있다.


  • 주의해야 할 점과 단점

    여느 책이 그렇듯 이 책 또한 주의할 점과 단점이 있다. 먼저 주의할 점으로 난이도를 언급하고 싶다. 이 책은 위에서 설명했듯 알고리즘의 실전 예제가 매우 수준이 높다. 취업을 목적으로 코딩테스트 통과를 목적으로 하는 수험생이라면 이 책이 적합하지 않을 수 있다. 각 예제들은 때로는 날밤새며 고요한 새벽에 깊은 집중을 필요로 하는 문제도 있다.

    그렇기에 알고리즘의 기본에 충실하지 않은 독자는 먼저 다른 책으로 알고리즘의 기초 정도는 충실히 학습한 후 보는 편이 나을 것이다. 아래 그림처럼 특정 알고리즘은 각 단계를 친절하게 도식화하여 설명하기도 하지만 이런 친절한 그림이 자주 등장하는 것은 아니다. 그림으로 익히는 알고리즘 유형의 책들이 시중에 많기 때문에 굳이 초보자가 난이도 높은 책으로 끙끙댈 필요는 없을 것 같다.뻐꾸기해싱

    더불어 Python이나 Java 등 어느 특정 언어로 알고리즘의 기본 구현 정도는 해 본 사람에게 적합한 책이다. 그렇지 않으면 이 책에 숨은 C++의 장점을 십분 살리기 어려울 것이다. 알고리즘과 C++ 모두 이해하지 못한다면 이 책을 어렵게 완독한다고 해도 반쪽짜리 지식만 얻게 될 가능성이 크다.

    적어도 하나의 언어에 빠삭한 사람이 알고리즘도 구현해보고 이 책으로 C++을 활용한 알고리즘과 비교한다면 C++의 매력이 무엇인지 어떨 때 쓰면 좋을지 언어 간 어떤 차이가 있는지 폭넓게 학습할 수 있을 것이다.

    단점으로는 책의 친절함(?)이 부족하다는 점을 지적하고 싶다. 일단 도식화 자료가 너무 적은 편이다. 더불어 시간 복잡도를 설명한 부분은 암기식으로 결론만 정리할 것이 아니라 멋진 예제에 시간복잡도 계산하는 방법과 절차를 다뤘다면 이 책은 어디서도 보기 힘든 역작이 되지 않았을까 하는 아쉬움도 있다.

    더불어 제목이 조금 마음에 안든다. 이 책은 코딩 테스트를 목적으로 하는 책이 아니다. 한 차원 더 높은 곳을 지향하는 사람들을 위한 책으로 코딩 테스트 통과를 목적으로 하는 사람에게는 되려 시간 낭비가 될 수 있다. 대신 여기 있는 문제들을 모두 풀 줄 안다면 코딩 테스트 따위는 뭐가 나와도 씹어 먹을 수준으로 변모해 있겠지만..


여담으로 온라인 서점에서 어떤 이의 평을 읽었는데 기가 찬다. 때로 본인의 목적에 맞지 않는 내용을 다룬다는 이유로, 혹은 난이도가 본인의 입맛에 맞지 않는다는 이유로 책에 혹평을 하는 이들이 있다. 이는 또 다른 목적으로 양서를 찾는 독자를 방해하는 행위라 생각한다.

왜 어려운 책은 늘 그 따위의 평점을 받아야 하고, 베스트 셀러같이 하위 90% 수준의 입맛에 맞춘 책은 칭송을 받아야 하는 건지 책을 사랑하고 리뷰를 즐기는 사람으로써 늘 불만이다. 독자의 목적에 충실한 책을 고르는데 있어 그런 서평은 무시하길 바란다.

끝으로 본 도서의 특징을 정리하며 리뷰를 마칠까 한다. 단순히 기초 알고리즘을 익히기 위한 사람이거나 C++을 배우고 싶은 사람에게 이 책은 적합하지 않다. 하지만 C++도 알고리즘도 어느 정도 알고있는 사람이 C++을 C++답게 활용하고 싶다면, 아울러 유치한 코딩 테스트 알고리즘을 뛰어넘어 현실의 문제를 알고리즘으로 해결해 보고 싶다면 이 책은 좋은 선택이 될 것이다.




댓글(2) 먼댓글(0) 좋아요(2)
좋아요
북마크하기찜하기 thankstoThanksTo
 
 
novdov 2021-06-19 22:09   좋아요 1 | 댓글달기 | URL
질 높은 서평 감사합니다 :)

nanhmjjang 2021-12-12 16:43   좋아요 0 | URL
부족한 서평인데도 애써 읽어주시고 좋은 평을 해주셔서 감사합니다!!
 
실전 시계열 분석 - 통계와 머신러닝을 활용한 예측 기법
에일린 닐슨 지음, 박찬성 옮김 / 한빛미디어 / 2021년 4월
평점 :
장바구니담기


본 도서는 업무 도메인 측면(의료-금융-공공-물리학 등)에서 기술적인 측면(통계-상태공간-머신러닝-딥러닝)에 이르기까지 시계열을 집대성한 책이다.

책에서 다루는 내용을 크게 나눠보면 다음과 같다.

  • 발견, 전처리, EDA, 시뮬레이션, 저장 및 처리, 피처 엔지니어링
  • 모델링 : 통계, 상태공간, 머신러닝, 딥러닝
  • 오차 측정, 배포, 성능
  • 사례연구 : 의료, 금융, 정부(공공데이터)
  • 그 외 기본 지식 : 시계열의 역사, 대규모 예측을 위한 패키지, 전망

내용에서 알 수 있듯 이 책은 폭넓은 도메인 영역과 기술을 다루고 있다. 이 점은 책의 큰 장점이자 단점이 될 수도 있는 부분이다. 눈에 띄는 장점은 일단 거의 전 분야에서 활용되는 시계열의 지식이 잘 정리되어 있다는 점이다.

시계열을 활용할 때 항상 어려웠던 부분은 지식이 분야별로 흩어져 있다는 것이다. 혹시라도 다른 진영 혹은 다른 도메인에서 유용하게 활용할 수 있는 기법이나 아이디어를 찾아보려 하면 그 영역까지 진입하기에 너무 오랜 시간이 걸린다.

또 R을 써야할지 Python을 써야할지 자주 고민이 생긴다. 세월이 흐르며 상호 보완되고 있긴 하지만 여전히 둘의 교집합에 제외된 어느 한 영역에만 속하는 독립적인 집합의 영역이 항상 존재한다. 예를 들면 롤링 조인과 같은 기술의 경우 Python에 비해 훨씬 사용하기 쉽고 직관적이다. 시계열 데이터를 처리할 때는 시점간의 연결 작업이 빈번한데 딱 맞게 매칭하는 작업이 너무 어려운 일이기 때문이다.롤링조인

또 R은 단 한 줄의 코드로 계절성, 추세, 잔차 등으로 분해가 가능하다. 왕초보 시절 이 기능을 Python으로 구현해보려고 덤벼들었다가 좌절 한 적이 있는데 찾아보면 언제나 유용한 기법들이 있다.

거인의 어깨 위에 올라가야 할 필요가 있는데 문제는 거인의 어깨에 어떤 것이 있는지 없는지 조차 몰라 검색 자체를 못하기 쉽상이다. 그런 측면에서 이 책은 각 언어별로 자주 활용되는 기술들의 핵심들이 잘 정리되어 있고, 각 도메인들이 잘 정리되어 있어 잘 모르는 분야의 아이디어의 메타 지식을 정리하기에 좋다.시계열분해

또 다른 장점으로는 초반 1 ~ 5장에 해당하는 부분이 마음에 들었다. 시계열은 전처리나 시뮬레이션이 꽤나 까다롭다. 책에서도 볼 수 있듯 결측치의 개념이 시간축에 의존한다. 그냥 일반 Tabular 데이터에서 빈값을 찾는 정도로 넘어갔다간 엉망이 된다. 전체 자료의 시간축을 살펴봐야 한다. 이런 사소한 부분부터 시뮬레이션이나 피처 엔지니어링에 이르기까지 모델링 이전에 필요한 작업들이 일목 요연하게 정리되어 있다.


반면 이런 장점을 수용하기 위한 트레이드 오프로 단점도 상당하다. 일단 너무 폭넓은 영역의 지식을 책 한 권에 담으려다 보니 그 깊이가 얕다. 난이도의 깊이가 얇은 것은 아니지만 한정된 지면에 너무 많은 지식을 다루다보니 추상적인 관점에서 바라봐야 하는 경우가 흔하다.

하지만 통계에서 활용되는 MA, AR, ARIMA 등의 모형만 예로 들어도 깊이 있게 알기 위해선 상당량한 학습이 필요하다. 책에서는 코어 부분에 해당하는 코드만 다루고 있으며, 수학도 추상적인 수준으로 설명이 되어 있고, 이론은 상당히 축약 설명되어 있어 이해하기 어려운 영역이 많다. 아무리 뛰어난 사람도 머신러닝, 딥러닝, 통계, 상태공간 등의 정보를 모두 깊이 있게 알고 있는 사람은 드물 것이다.

취약한 부분이 있게 마련일텐데 그런 파트를 만나면 진땀 빼며 읽어야 한다는 단점이 있다. 그렇기 때문인지 번역 수준 또한 어느 파트는 매우 매끄러운데, 어느 파트는 난해하기 그지 없다.

또 하나의 단점으로는 R과 Python의 코드가 왔다갔다 한다. 이것은 저자를 탓할 문제는 아니다. 앞서 언급했듯 각 언어별 제공하는 기능이나 편의성에 차이가 현격한 부분도 존재하기 때문이다. 더불어 이를 완벽하게 정리, 파악할 수 있는 사람은 매우 드물 것이다. 사람의 수명에 한계가 있는데 어떻게 수 많은 API나 기능을 다 정리할 수 있을까? 그래서 십분 이해가는 부분이긴 하지만 독자의 입장에서는 영 불편한 것이 사실이다. 그래서 R과 Python의 연동에 관한 경험에서 우러나온 Tip도 수록되어 있었다면 어땠을까 하는 아쉬움도 있다.

코드 역시 실전 중심적이진 않다. 만약 구현 과정을 따라하며 배우고 싶은 독자는 이 책이 적합하지는 않을 것이다. 상당히 추상화 된 레벨에서 큰 그림을 그려 나가야 하는 책이기 때문이다. 연구 중심의 서적이라고나 할까? 대부분의 예제 코드는 실전 데이터 셋을 활용하기 보다는 각 이론을 설명하기 쉬운 형태의 가상 데이터를 가공하여 활용한다.

덕분에 모델을 이해하는데 도움이 상당하지만 실전에서 봉착할 수 있는 다양한 케이스에는 취약하다고 할 수 있다. 그래도 사례연구 파트에서 실전과 유사한 데이터를 활용하여 감을 잡는데 조금은 도움이 되었다.시계열분해

그럼에도 이 책을 추천하고 싶은 이유는 시계열과 관련된 메타 지식이 체계적으로 정리되어 있다는 매력을 떨치기 어렵기 때문이다. 타 도메인 혹은 기술 분야에는 어떤 해법들이 숨겨져 있는지 전체적인 시야로 조망해보고 필요할 때 쉽게 참조할 수 있다는 장점은 무시 못할 매력이라 생각한다.

각 장 말미에 굵직한 획을 그은 유용한 시계열 논문이 잘 정리되어 있는 것도 장점 중 하나이다. 기존 책들이 시계열을 어느 특정 기술의 부분집합으로 다뤘다면 이 책은 시계열을 중심으로 전반적인 기술들을 엮어 보는 횡적 관점에서 접근한다. 타 분야의 유용한 아이디어를 빠르게 살펴보고 싶다면 본 도서를 살펴보길 권유한다.


한빛미디어 “나는 리뷰어다” 활동을 위해서 책을 제공받아 작성된 서평입니다.



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
북마크하기찜하기 thankstoThanksTo
 
 
 
파이썬 챌린지 - 150개의 코딩 과제로 배운다
니콜라 레이시 지음, 황반석 옮김 / 제이펍 / 2021년 5월
평점 :
장바구니담기


본 도서는 최소한의 설명과 함께 150개의 코딩 문제를 직접 풀어보며 Python을 익히는 독특하고 재미있는 입문서이다. 각 챌린지가 다루는 문제는 굉장히 초급 수준이지만 파이썬의 문법에 익숙해지기에 적합한 문제들이기도 하다. 암기보다는 문제 해결 능력에 초점을 맞춘 점이 가장 큰 장점이다.

먼저 추천하고 싶은 대상 독자는 다음과 같다.

  • 코딩을 처음 접하는 학생, 비전공자 등 입문자(왕초보)
  • Python의 문법을 배웠지만 당장 구현에는 자신이 없는 이론에만 자신있는 사람
  • C, Java 등의 타 언어를 알고 있음에도 Python으로 전향을 원하는 사람

만약 이 유형에 해당하지 않는다면 본 도서는 너무 쉬워 큰 도움이 되지 않을 수도 있다. 물론 프로그래밍은 한 번이라도 더 구현할수록 새롭게 얻는 것이 생기기 때문에 심심풀이로 도전해봐도 재미있을 것이다. 하지만 본 리뷰를 읽을 필요는 없을 것 같다.

위 3가지 유형 해당자들을 위해 리뷰를 계속 진행하겠다. 우선 각 챌린지를 진행하기 앞서 이론이 고작 한 두 페이지 수준으로 짧게 설명되어 있다는 점이 인상적이었다.

개인적으로는 마음에 드는 구성이지만 이 정도 설명으로 과연 배울 수 있을까라는 의구심이 들었다. 하지만 이어지는 챌린지 문제들을 하나씩 풀어보니 충분히 가능한 구성이라는 생각이 들었다. 백견이 불여일타 식으로 철저히 실습을 통해 프로그래밍을 익히도록 구성된 점이 가장 큰 장점이다.

길게 설명할 것 없이 괜찮았던 예제 하나를 중심으로 책의 구성 방식을 설명해보겠다. 대상 예제는 어느 프로그래밍 언어에서나 가장 흔하게 쓰이는 문자열 파트의 마지막 문제로 골라보았다. 본문 59p에 등장하는 87번 챌린지이다.

어떤 느낌인지 확인하고 싶다면 아래 예시를 풀어보길 바란다. 참고로 이 문제는 책의 등장하는 문제 중 중간 난이도 정도 된다. 이 문제를 푸는데 쉽지 않았다면 이 책이 분명 도움이 될 것이다.


  • 개념
    먼저 문자열의 개념을 한 페이지로 간단하게 설명한다. Python에서 문자열을 다룰 때 흔히 사용하는 슬라이스를 위해 인덱스 개념을 알려준다.개념

  • 예제코드
    다음으로는 예제코드가 등장한다. 문자열 파트에 해당하는 80 ~ 87번 챌린지를 풀기위한 기초 문법으로 그대로 따라서 구현해보면 좋다. 기본 패턴 및 일종의 API를 배우는 과정이라고 생각하면 된다.예제코드

  • 챌린지
    본격적으로 챌린지 문제가 등장한다.챌린지

  • 답안
    마지막으로 정답이 등장한다. 프로그래밍 세계가 언제나 그렇듯 답은 여러가지가 존재하지만 책에는 가장 쉽게 구현할 수 있는 답안 하나만 제시한다.답안


위와 같은 4단계 방식(개념-예제-챌린지-답안)으로 전체 18개의 장 150개의 챌린지가 등장한다. 초보자라면 분명 훈련하는데 충분할 만한 양이며 다 끝내고 나면 상당히 자신감이 생길 것이다. 장마다 다루는 주제는 다음과 같다.

  • 기초, 문자열, random, 파일I/O
  • if, for, while, 함수
  • 수학 함수, 튜플, 딕셔너리, 리스트, 배열, 2차원,
  • 터틀그래픽, Tkinter, SQLite

Python에서 가장 쉽지만 가장 활용도가 높은 주제들로 구성되어 있다. 그 중 터틀그래픽, Tkinter, SQLite과 같은 요소는 Python에서 다루는 주력 기능들도 아니고 다른 언어에서 더 활용도가 높은 기술들이지만 포함시킨 것이 좋다고 본다.

이런 스킬들을 알아야 직접 눈으로 그림그리고 GUI 만들어보고 자신이 원하는 목적의 가시적인 프로그램 하나를 만들 수 있기 때문이다. 나도 대학 시절 전공으로 처음 언어를 접했을 때 내 일기장이나 혹은 가계부 같은 것을 만들면서 진도를 빨리 뗄 수 있었던 기억이 난다.

이런 스스로 원하는 목적을 달성할 수 있도록 동기부여가 되어야 프로그래밍 실력이 빨리 늘텐데 그저 목적없는 예제의 타이핑은 학습을 쉽게 지치게 만들 것이다. 그런 점에서 초보자들을 위한 완급 조절이 잘 된 책이라는 생각이 들었다.

다만 구성에서 몇 가지 아쉬운 점도 보였다. 위에서 소개한 4단계 방식 중 답안 부분이 조금 모호하다. 답안을 작성하기 위해 저자가 어떤 방식을 접근했는지 그리고 상세한 주석 등이 추가되었다면 학습자의 입장에서 복습도 되고 좋았을 텐데라는 생각도 들었다.

하지만 또 달리 생각하면 아리송하다. 답안은 1개만 존재하지 않는다. C언어의 포인터 개념을 알고 있는 사람이라면 위 예제의 경우 다른 답안을 내놓았을 것이다. C언어의 포인터를 사용하듯 index를 이용하여 reverse 인덱스를 이용할 수도 있기 때문이다. 다음과 같이 말이다.

user_str = input('input:')
for i in range(-1, (len(user_str)+1)*-1,-1):
    print(user_str[i])

또 다른 방식으로는 시간복잡도 등 알고리즘 성능 면에서는 좋다고 볼 수 없겠지만 배우는 입장에서는 다양한 시도가 살이되고 피가 되므로 이런 방법도 있을 수 있겠다.

user_str = input('input:')
reverse_str = ''
for i in range(0, len(user_str)):
    reverse_str = user_str[i] + reverse_str
for i in reverse_str:
    print(i)

입력받은 문자열을 맨 뒤로 붙여나가는 방식이다. for문을 2번써서 실전에서는 좋지 않은 코드이지만 배울 때는 다양한 길을 갈 필요가 있다. 또 다른 방식의 코드도 얼마든지 더 있을 수 있다.

어쨌든 책에서 이런 다양한 경우와 접근법의 설명이 없는 것은 다소 아쉽지만 역으로 생각하면 쉽게 어떤 하나의 패턴을 외우는 식으로 접근할까 우려된 구성이 아닌가 싶기도 하다. 또한 내 방식대로 모두 분량에 포함된다면 양이 늘어 지레 겁먹고 원본의 구성 상 깔끔함을 유지하기 어려웠겠다는 생각도 든다.

추천하고 싶은 공부 방식은 끝까지 디른 레퍼런스를 참조하지 말고 될 때까지 삽질하며 구현했으면 좋겠다. 몇 시간이 지나도 구현이 어렵다면 예제 코드만 다시 보자. 그래도 어렵다면 Python의 공식 레퍼런스를 참조하자. 그래도 어렵다면 블로그 등 인터넷을 검색하자. 답안은 스스로 풀기 이전엔 절대 보지 않았으면 한다. 저자의 풀이와 다른 내 풀이를 비교하면서 배우는 과정도 필요하기 때문이다. 그 후에는 위에 내가 예시를 든 것 처럼 다른 접근법으로도 풀어봤으면 좋겠다.

이렇게 푸는 것이 시간이 오래 걸릴 수는 있을지 몰라도 넓게 바라보면 가장 빠른 지름길이다. 그리고 그런 과정을 거쳐야 사고의 깊이도 깊어지고 암기도 오래 지속된다. 삽질 끝에 달콤한 해결책은 쉽게 머리속을 떠나지 않기 때문이다.

느낌이 꼭 메모리 하이라키 개념 마냥 HDD에 있는 지식을 레지스트리에 옮기는 느낌이랄까? 삽질해서 외운 지식은 떠오르기도 매우 빠르게 떠오른다. 추후 실전에서 복잡하고 거대한 프로젝트를 진행할 때 이런 순식간에 가져다 쓸 수 있는 지식이 항시 준비하고 있어야 다른 모르는 영역에 집중할 수 있기 때문이다.

그리고 프로그래밍 연습에서만큼은 복잡한 Tree마냥 각 경우의 수를 다 경험해 보는 것이 좋다. 그래야 나중에 성능도 개선시킬 수 있기 때문이다. 마치 위 예제에서 시간복잡도가 불리한데도 한 번 구현해 보는 것 처럼 말이다.

파트2는 파트1의 150개 예제와는 다른 구성이다. 오직 문제와 필요한 자료만 주어진다. 총 5개의 챌린지가 등장하는데 일종의 작은 실전 프로젝트라고 보면 된다. 파트1을 익혔다면 능히 풀 수 있는 문제들인데 만약 못 풀었다면 마찬가지로 답안을 볼 것이 아니라 파트1을 다시 복습하기 바란다.답안

마지막으로 언급하고 싶은 것이 있다. 이 책은 Pythonic에 중점을 둔 책이 아니라 프로그래밍의 기초에 중점을 둔 책이다. 예를 들면 file I/O 파트에서 with 구문을 쓰지 않는다. 별도의 close() 구문을 구현하도록 안내한다. 이는 Pythonic 하지 않은 부분이지만 기초 프로그래밍 과정에서는 좋은 방법이다. 대신 본 책을 마치고 나면 이런 Pythonic에 대한 보완을 염두에 두어야 한다.

array의 경우나 math 라이브러리 부분도 마찬가지이다. python이 데이터 분석에 강점이 있는 언어인만큼 보다 많이 활용하는 Numpy 등을 다뤄야 한다. 성능 상 GPU를 이용하는 Vectorization의 개념 등이 존재하기 때문이다. 약간 문법이 달라지기도 한다는 점에 주의를 해야 한다. 하지만 기본 개념을 충실히 익히면 다른 라이브러리들에 적응하는데 큰 도움이 될 것이다.

프로그래밍을 처음 배우는 분들께 도움이 되고 싶어 간만에 리뷰가 길었다. 프로그래밍을 프로그래밍답게 익히고 싶다면 본 도서를 강력히 추천하고 싶다.




댓글(0) 먼댓글(0) 좋아요(0)
좋아요
북마크하기찜하기 thankstoThanksTo
 
 
 
나는 독이 되는 관계를 끝내기로 했다 - 소모적인 인간관계에서 해방되는 21일 프로젝트
마리옹 블리크 지음, 조민영 옮김 / 한빛비즈 / 2021년 4월
평점 :
절판


나 자신 스스로와 타인을 잘 알고 서로의 관계를 개선하기 위한다면 이 책이 많은 도움이 될 것이다. 책 제목만의 뉘앙스는 인간 관계를 가지치기 하는데 초점을 맞출고 있을 것 같아 보이지만 세상사 관계를 끊는 것만으로 모든 것이 해결되지는 않는 법. 인간 관계를 제대로 직시하고 해결책을 얻는데 초점을 맞춘 책이라고 보면 된다.

열길 물 속은 알아도 한길 사람 속은 모른다는 속담처럼 우리는 5%만 드러난 서로와 상대할 뿐 남은 95%를 모른채 서로를 바라본다.페르소나

가뜩이나 서로를 모르는데 때로는 나 자신도 이해하기 어려울 때가 많다. 우리에게 3개의 뇌가 있기 때문이다. 대뇌피질이 이성적으로 인식하고 판단하기 전에 생존을 담당하며 가장 빠른 파충류의 뇌가 이미 우리를 장악하기 때문이다. 분노에 휩싸이면 사고가 정상적으로 동작하지 않는 이유이기도 하다.3개의뇌

한술 더 떠 파충류의 뇌가 판단하기 전에 반사적으로 심장이 더 빨리 뛰는 경우도 있다고 하니 감정의 매커니즘은 참 알기 어려운 세계라는 생각이 든다. 책에서 더 많은 감정의 매커니즘을 분석하고 있지만 내가 느끼기에 가장 어려운 요소는 위에 언급한 두 가지라는 생각이 든다.

저자는 인간관계 문제로 수십 년간 고민해 온 당사자로써 인지 및 뇌과학의 발달된 연구 결과에 도움을 받아 본 도서를 저술하였음을 밝히고 있다. 그간 인지, 뇌, 심리학, 감정, 인간관계에 관련된 도서를 제법 많이 읽어왔는데 이구동성으로 말하는 핵심 내용이 모두 담겨 있다.

책은 크게 3개의 파트로 이루어져 있다. 먼저 1부에서는 관계의 유형을 4가지로 나눈다.

  • 가장 이상적이고 많은 비중을 차지하는 안정형
  • 관계를 기피하는 회피형
  • 사랑을 갈망하는 양가형
  • 감정 기복이 심한 혼돈형

저자는 독자 본인 혹은 관계를 맺는 그 누군가의 유형이 어느쪽에 속하는지 판단함으로써 보다 정확한 현상을 진단하여 개선책을 마련하는데 도움이 될 수 있음을 강조한다.

그리고 유형별로 얽히며 발생하는 다양한 갈등의 사례를 살펴본다. 참고로 사회적인 관계보다는 주로 부부, 연인, 남녀 관계에 집중하여 사례를 살펴본다. 남녀 문제로 고민이 많은 독자라면 이 책은 꽤 좋은 선택이 될 것이다.

2부에서는 관계에서 독성에 해당되는 부분을 알아본다. 최근 너 때문에 내일 회사 가기 싫어!라는 리뷰에서 다룬 것과 비슷한 또라이 유형 중 나르시시스트를 집중적으로 살펴본다. 그놈들은 지만 알고 지 마음대로 되어야 직성이 풀리는 유형이다.

다소 특이했던 것은 예상과는 달리 상대를 제압 혹은 상대로 부터의 회피에 초점을 맞춘 방법이 소개되었을 거라 생각했는데 나 자신에 초점을 맞춘 방법에 중점을 맞춰 놀랐다. 사실 그동안의 대인 관계를 다룬 책을 여러번 읽어보니 조금 알 것도 같다.

우리는 대부분 나 자신은 문제없고 상대방이 문제라고 생각한다. 하지만 살다보면 그리고 이런 책들을 읽다보면 또 한가지 사실도 알게 된다.

“나 자신은 바꿀 수 있지만, 상대방은 바꿀 수 없다는 사실을…”

보다 현실적으로 대응법을 나 자신을 통해 찾으려 했다는 시도가 신선했고 책의 장점으로 소개할 만한 부분이라는 생각이 들었다.

이런 또라이들이 유아기에서 어떻게 지금의 성인 또라이로 양산(?)되었는지 이해도 해보고 알아도 보고 현실을 온전히 받아들인 내가 취할 수 있는 현명한 감정 조치 혹은 관계 단절 등에 대해 살펴본다. 저자의 판단이 현실적이고 현명 하다는 생각이 들었다.

3부에서는 건강한 관계를 맺는 방법을 다루는 데 개인적으로는 가장 도움이 된 파트였다. 다행히도 1부의 점검 결과 나는 안전형에 속하는 사람이었다. 그래서인지 주위 관계에 크리티컬한 문제는 없는 편이다.

물론 1부의 여러 사례와 2부의 또라이들을 분석하는 것이 흥미로웠고 인간 관계로 어려움에 처한 다수의 사람에게는 많은 도움이 될 것이다. 하지만 나 자신에게는 발생하지 않는 문제이기도 해서 관심이 덜 갔다.

반면 3부는 나같은 안전형들이 보다 원만하고 건설적인 관계를 맺는 공통적인 Tip들이 많이 소개되어 좋았다. 그 중 대표적으로 선 긋기에 대한 부분과 파충류 뇌 작동 시 생각의 전원을 잠시 차단하는 방법이 꽤 유용한 방법이라는 생각이 들었다.

먼저 선 긋기란 당장은 약간의 불편함이 있을지라도 보다 건강한 미래 관계를 위해 스스로 원하지 않는 것을 “아니요”라고 말 할줄 알아야 한다는 뜻이다. 아래 구체적인 책의 사례를 읽어보면 어떤 의미인지 확실히 와 닿을 것이다.아니요

또한 파충류의 뇌가 급발진 할 때 잠시 전원을 꺼두는 훈련을 할 필요가 있다는 생각을 했다. 분노에 차면 대뇌 피질이 마비되는 현상을 누구나 겪었을 것이다. 때로는 그 기제가 사이다를 안겨주기도 하지만 두번 다시 생각하기 싫은 결말이나 피해를 가져오기도 한다.

대부분은 통제되는 편이 훨씬 살아가는데 도움이 되기에 잠시 전원을 차단할 수 있는 능력을 키우는 것이 좋다. 책에 나온 조언대로 나는 살면서 이런 전원을 차단하는 방법을 하나씩 만들어 볼 생각이다.

마지막으로 저자의 독특한 이력에 관한 내용을 하나 소개하려 한다. 저자는 극성요법 지도 자격을 갖춘 사람으로 책의 곳곳에도 EFT라는 감정자유기법이 소개된다. 일종의 대체 의료 기술이라고 볼 수 있는데 동방의 한의사와 비슷한 방법으로 감정 및 스트레스를 치료하는 기법이다. 익혀 두었다가 감정을 조절하기 힘들 때 사용해 보면 좋을 듯 하다.감정자유기법

총평을 내리자면 사람의 감정, 인지, 뇌에 관한 과학의 연구성과를 근간으로 관계를 지배하는 감정의 매커니즘을 알아보고 유형별로 나눠 효과적인 관계 개선을 조언하는 책으로 스스로의 마음을 다스리는 방법에 더 주안점을 두고 있기에 감정 혹은 사람 때문에 힘든 모든 독자에게 추천하고 싶다.




댓글(0) 먼댓글(0) 좋아요(1)
좋아요
북마크하기찜하기 thankstoThanksTo
 
 
 
만화로 배우는 곤충의 진화 - 한빛비즈 교양툰 한빛비즈 교양툰 1
갈로아 지음 / 한빛비즈 / 2018년 10월
평점 :
장바구니담기


본 도서는 곤충의 진화를 다룬 교양 만화이다. 어렵게만 느껴지는 생물학과 곤충의 세계를 작가 특유의 드립력으로 소개하고 있고 읽기에 부담없는 만화로 구성되어 있어 곤충을 재미있게 배울 수 있다는 점이 매력이다. 처음엔 몰랐는데 과거에 디시인사이드 곤충 갤러리, 네이버 포스트 등에 연재된 과학 웹툰이었다고 한다.

이 책은 교양툰 시리즈 중 하나이다. 교양툰 시리즈는 일전에 블로그를 통해서 잠깐 소개한 바 있는데 양자역학조차 알기 쉽게 설명할 정도로 방대한 지식을 부담없이 빠르게 배울 수 있다는 점과 만화로 구성되어 있다는 점이 큰 장점이다. 참고로 교양툰 시리즈의 다른 책 리뷰를 확인하고 싶다면 아래 링크를 클릭하기 바란다.

곤충의 진화 역시 기대를 저버리지 않았다. 곤충이 탄생한 순간부터 현재까지 진화의 과정을 담고 있으며 곤충이 가지는 독특한 특징인 외골격, 날개, 사회성, 유전 등의 내용으로 구성되어 있다. 더불어 개미, 바퀴벌레, 모기와 같은 대표 곤충들을 집중적으로 분석한다.곤충계보

책이 가지는 또 다른 장점 중의 하나는 곤충만을 다루지 않는다는 점이다. 곤충과 유기적인 관계를 가지는 다른 생물들인 균, 식물, 곤충 외 절지동물들도 다루며 지구의 탄생 과정도 간접적으로 경험할 수 있다. 10 ~ 11화에 해당하는 진화론 파트에서는 번쩍이는 인사이트를 얻을 수 있음은 물론, 생물학자들의 연구성과를 엿 볼 기회가 있어 폭넓은 과학 상식을 습득할 수 있다는 점이 장점이다.

저자는 어린시절 과학자와 만화가를 동시에 꿈꾸던 현 곤충학자로 곤충학자가 갖고 있는 전문성을 또 하나의 꿈인 만화가의 능력으로 풀어냈다. 그렇기에 책의 내용이 제법 난이도 있고 알찬 지식으로 가득찼음에도 보통 만화책 읽듯 쉽게 흡수할 수 있었던 것이 아닌가 싶다.

게다가 저자에게는 아주 독특하고 보기 드문 유머 감각(?)이 있다. 김성모 만화부터, “내가 고자라니”로 유명한 짤 등 인터넷에서 누구나 봤을 법한 재밌는 소재들이 중간 중간 튀어나와 전혀 지루하지 않다. 그렇기에 성인은 물론 특히 학생들에게 매우 유익한 책이라는 생각이 든다.드립

다만 12 ~ 15화는 곤충의 성생활을 다루고 있기에 너무 어린 자녀가 보기엔 약간 곤란할 수도 있다.수위조절

다루는 소재도 온갖 신기한 것들 투성이다. 예를 들면 개미의 수컷 염색체에 관한 내용을 들 수 있다. 개미 수컷이 X 염색체 하나로 이루어져 있다는 사실은 이번에 처음 알게 되었다. 게다가 개미는 암컷 혼자서 알을 낳을 수 있다. 수컷과 수정을 통해 알을 낳으면 XX 염색체의 암컷이 나오고, 암컷 혼자서 낳으면 X 염색체 하나인 수컷을 낳는다.

더욱 흥미로운 것은 그런 염색체의 특수성 때문인지 50%의 유전자가 전달되는 자식보다 75%의 유전자가 전달되는 여왕개미의 산란이 염색체 관점에서는 더욱 유리하다. 그렇기에 일개미들은 알을 낳지 않고 여왕개미만이 산란을 담당하게 된 것으로 추정하고 있다.개미염색체

이런 신기한 소재들을 읽어나가다보면 교양이 풍부해지고 재미있음은 물론 사람과 비교하며 그동안 당연한 줄 알았던 것들이 낯설게 보이며 많은 부분에서 영감을 준다는 점 또한 책의 백미 중 하나이다.

개인적으로 가장 마음에 들었던 점은 진화 및 진화론을 다룬 부분이다. AI를 연구하면서 그동안 진화와 관련있는 인공지능은 유전학습 정도로 인식하고 있었다. 그런데 읽다보니 진화론에서 나온 AI의 아이디어가 한두가지가 아니다. 이렇게 또 기초 과학의 소중함을 새삼 깨달았고 더불어 자라나는 우리 세대 아이들이 이런 책을 통해 호기심을 얻고 기초 과학에서 옥석을 가려 응용분야에 접목했으면 좋겠다는 생각이 들었다.

무슨 말인지 AI 분야로 예로 들어보겠다. 사람이 과학이나 수학의 법칙을 만드는데 있어 가장 큰 지식과 인사이트는 자연에서 얻고 있음을 모두 알 것이다. 자연 속에 숨어 있던 늘 당연했던 패턴에 의구심을 품고 중력을 발견하거나 미적분을 발명했듯이 말이다. 이처럼 사람이 자연의 패턴을 분석하고 배우는 관점은 AI 모델링 혹은 지도 학습과 유사한 면이 많다.

더불어 유전학습은 아까 언급했으니 건너뛰더라도 알파고를 만들 수 있었던 핵심 기법 강화학습에 대한 아이디어도 진화론과 유사하다. 강화학습은 크게 환경, 에이전트, 액션으로 이루어지는데 진화론에서도 마찬가지로 환경에서 생존하기 위한 개체가 살아남아 진화가 됨을 설명하고 있다. 강화학습은 생존대신 보상을 많이 받고자 하는 매커니즘으로 이루어져 있으며 매우 흡사하다. 역시 AI를 만드는데 제일 좋은 방법은 창조주가 자연을 만드는 과정을 모방하는 것이 아닐까 싶다.

그저 놀라는데서 그치지 않고 이 책을 읽으며 샘솟은 아이디어는 사실 따로 있다. AI는 지도학습을 통해 발전하는데 생명체와 달리 영생한다. 전기가 차단되지 않는 한 말이다. 생물은 죽음이라는 유한 메타 덕분에 진화에 성공하게 된다. 환경에 경쟁력이 없는 것들이 죽어나가면서 변이된 종들이 살아남아 이어져 내려오기 때문이다. 그렇다면 AI에 죽음은 어떤 의미가 있고, 어떻게 활용(?)할 수 있을지 생각해보며 많은 지적 유희를 즐길 수 있었다.

또 한가지의 흥미로운 생각은 성(性)과 번식에 있다. 인간의 성은 염섹체의 결합과정으로 다양성을 가진다. 하지만 AI에는 성이 없다. 그렇다면 을 이용하면 다양성을 갖출 수 있지 않을까?

이런 저런 번쩍이는 생각들로 지적 유희를 한바탕 신나게 즐길 수 있었다. 너무 재미있어서 손에서 놓을 수도 없었다. 아이가 와서 놀아달라고 보채는 시간을 제외하고는 책상과 쇼파에서 항상 이 책을 들고 정신없이 읽었다. 읽어보면 알 것이다. 쉽사리 손 뗄 수 없음을.. 그런 의미에서 자라나는 청소년과 곤충 및 과학에 관심이 많은 성인들에게 강력하게 추천하고 싶다.




댓글(0) 먼댓글(0) 좋아요(0)
좋아요
북마크하기찜하기 thankstoThanksTo