[Day-Warm-up] 손코딩과 알고리즘

CS-Basic 페이지 에 따라 어제(23일)과 오늘 학습의 일부를 정리용을 기록한다. 우선 9월 까지는 Warm-up 기간으로 생각하고 편안하게 임한다.

몸풀기로 ACM-ICPC의 기본문제 1000, 1001을 C++, Java, C로 처리했다.  풀었다고 하기 민망한 간단한 예제로, 온라인 저지를 어떻게 쓰는지 감을 익히는 정도라고 생각했다.

한 가지, Java로 구현할 때 IDE 도움 없이 손코딩 하면서 입력을 받기 위한 Scanner 클래스를 사용하자니 어떤 클래스를 import하는지 생각이 안났다. 확인하니 java.util.Scanner를 import해야 한다. 그동안 너무 IDE의 편한 인텔리센스 기능에만 의존한게 아닌가 생각이 든다. 어렵지 않으니 Java Scanner에 대해서 간단히 복습해 두자

문제 난이도가 번호 순으로 올라가겠지 하고 1002번을 이어서 시도했다. 문제의 핵심은 두 원을 교차하는 점의 개수를 구하는 것이라 파악은 했지만 끝내 어제와 오늘 일부의 시간을 할애하고도 풀지 못했다. ㅠㅠ;

처음에는 단순하게 두 원의 교차관계를 생각하고 “R-r < d < R + r” (여기서R,r은 서로 다른 두원의 반지름, R이 큰 값, d는 두 원의 중심 사이의 거리) 에 해당하면 2를 반환시키고, R+r =d 이면 1, 아니면 0을 반환시키는 단순한 코드를 작성했다. 그러나 당연히 실패!

좀 더 생각해 보니 두 원의 관계가 저렇게 단순한 경우만 있는 것이 아니라는 것을 알았고 위와 같은 방법으로는 문제를 풀 수 없다는 것을 깨달았다. 이 때부터 기나긴 삽질의 시작…

algorithm study

전략을 바꿔 두 원의 방정식을 가지고 근의 개수를 구하는 방법으로 변경했다. 그러나 여기서 새로 봉착한 장애물은 문제의 조건이 가로세로 좌표가 -10000에서 10000으로 제한되어 있다는 점이다. 결국 GG를 ㅠ

복잡한 심경에 바로 다음 문제 1003 도전. 피보나치 수열을 응용한 문제였다.  피보나치 수열을 재귀로 풀되 base 케이스가 되는 0 또는 1이 몇번 나오는지를 카운트하는 문제.

나 또한 재귀적으로 접근해서, 0과 1의 사용빈도를 보관할 변수를 전역변수로 두고서 함수가 재귀적으로 돌면서 0과 1이 나타나면 카운트를 올리게 해서 문제를 풀었다.

답은 맞았지만 개선의 여지가 없을까하고 다른 사람들의 답을 좀 뒤져보려고 했더니… 아하 여기에도 문제에 제약조건이 있었다. 입력 조건이 40이하였다. 그러고 보니 어떤 분이 아예 for문으로 40까지 다 계산하고 나서 입력에 맞는 값을 출력하는 방식으로 구현해 놓은 것을 확인했다.

어제와 오늘의 연습을 통해서 어떤 식으로 문제를 접근해야 할지 조금 감이 온다.

어제 저녁에 “알고리즘 문제 해결 전략” 첫부분을 읽으면서 문제풀이의 과정을 6단계로 설명한 것(23p)이 앞으로의 학습에 도움이 될 것 같다.

  1. 문제를 읽고 이해한다.
  2. 문제를 익숙한 용어로 재정의한다. (추상화)
  3. 어떻게 해결할지 계획을 세운다.
  4. 계획을 검증한다.
  5. 프로그램으로 구현한다.
  6. 어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아본다. (회고)

Java 객체 지향 디자인 패턴 리뷰

개발과 관련된 학습정보는 웹을 통해서 풍성하게 얻을 수 있다. 디자인 패턴 또한  위키피디아부터 시작해서 블로그에 잘 정리된 양질의 컨텐츠들이 참 많다. 더욱이 디자인 패턴은 케이스별로 다룰 수 있어 웹에서 관심 있는 패턴들을 검색해서 학습하기도 용이하다. 그런데 문제는 웹 상의 컨텐츠에는 대부분 “왜”가 빠져 있다는 점이다 . 컨텐츠의 작성자들은 대부분 “왜”를 가정하고 내용을 설명하고 있기 때문이다.

한빛미디어 리더스 8기 세 번째 미션!~

최근에 출판된 한빛미디어의  “Java 객체 지향 디자인 패턴“은  “왜 이 패턴이 필요한가?”에 질문에 답과 함께 패턴의 내용을 설명한 책이다.  패턴이란 것이 원래부터 있던 정형화된 이론이라기 보다는 시간이 지나면서 쌓여진 노하우이기 때문에 책만 읽는다고 해서 쉽게 내 것이 되지는 않는다.  다행히도  두 저자는 오랜 강의 경력을 바탕으로 이러한 문제를 충분히 절감하고 최대한 상세하게 패턴의 필요성을 피력하고 있음을 이 책에서 볼 수 있다.

한빛미디어 리더스 8기 세 번째 미션!~

책의 내용은 총14장으로 이루어져 있고, 이 중 1-4장은 디자인 패턴과 관련된 기본적인 내용 설명을 다루고 5장부터 14장까지 다음의총 10개의 디자인 패턴에 대해서 설명한다.

[책에서 설명하는 10가지 패턴]

  1. 스트래티지 패턴
  2. 싱글턴 패턴
  3. 스테이트 패턴
  4. 커맨드 패턴
  5. 옵서버 패턴
  6. 데커레이터 패턴
  7. 템플릿 메서드 패턴
  8. 팩토리 메서드 패턴
  9. 추상 팩토리 패턴
  10. 컴퍼지트 패턴

디자인 패턴 후면

각 디자인 패턴에 대한 설명은 그림과 같이 패턴이 적용되지 않은 일반적인 코드를 통한 문제 사례와 함께 문제를 인식하는 단계, 패턴을 도입하여 해결책을 제시하고,  패턴에 대한 설명과 함께 효과를 입증하는 순서로 반복 진행된다.

더불어 책의 부제에서 알 수 있듯이 이 책은 10가지 패턴을 “UML”의 클래스 다이어그램과 컬래보래이션 다이어그램을 가지고  설명하면서 자연스럽게 UML을 눈으로 익히고 보는데 큰 도움을 준다.

디자인 패턴 컬래보레이션 다이어그램

큰 장점이 될 수 있는 점은 부분은 모든 예제 문제와 연습문제에 해답을 제공하고 있다는 점이다. 문제는 제공하지만 해답을 제공하지 않거나 일부만 제공하는 책들과 비교했을때 저자의 세심한 배려가 눈에 띄는 부분이다.

다만, 역으로 생각하면 해답으로 제공되는 내용이 전체 책의 약 1/5이 된다는 점을 고려할 때 해답은 따로 PDF 형식으로 제공하고 책을 좀 더 가볍게 만들었으면 어떨까하는 아쉬움이 드는 부분이기도 하다.

한 가지 더 아쉬운 점은 들자면 이 책은 예제 소스를 제공하지 않는다.요즘 프로그래밍 서적 대부분이 예제 코드를 Github이든  zip 형태이든 어떤 방법으로든 제공하고 있다는 점을 고려할 때 조금 아쉽다는 생각이다.

요약하면, 이 책은 각 디자인 패턴의 필요성, 내용, 실제 적용과정 및 결과를 일관된 순서로  설명한다. 모든 챕터에 연습문제와 해답을 제공함으로 책 한권으로 혼자서 학습하기에 부족함이 없는 책이다.

본 리뷰는 한빛 리더스 8기 활동의 일환으로 작성한 것입니다.

한빛리더스 8기