본문 바로가기
Blog/미디어

책. Think Like a Programmer - An Introduction to Creative Problem Solving

by NAMP 2016. 4. 1.

Think Like a Programmer - An Introduction to Creative Problem Solving

The Fox, the Goose, and the Corn

문제: 어떻게 강을 건널 것인가?

여우, 거위, 옥수수의 자루를 가지고 있는 농부는 강을 건너야 한다.
농부는 노 젓는 보트가 하나 있다.
보트에는 농부와 하나의 아이템만 실을 수 있다.
불행하게도, 여우와 거위는 모두 굶주려 있다.
여우는 거위와 함께 혼자 놔둘 수 없다. 여우는 거위를 먹을 것이다.
마찬가지로, 거위는 옥수수와 함께 혼자 놔둘 수 없다.
거위는 옥수수를 먹을 것이다.

육지 육지
여우, 거위, 옥수수 시작
여우, 옥수수 > 거위
여우, 옥수수 < 거위
옥수수 > 여우, 거위
옥수수, 거위 < 여우
거위 > 여우, 옥수수
거위 < 여우, 옥수수
- > 여우, 옥수수, 거위

먼저, 제약사항을 나열한다.

  1. 농부는 보트에 한번에 하나의 아이템만 실을 수 있다.
  2. 여우와 거위는 함께 혼자 놔둘 수 없다.
  3. 거위와 옥수수는 함께 혼자 놔둘 수 없다.

다음, 기능을 나열한다.

  1. 여우를 옮긴다.
  2. 거위를 옮긴다.
  3. 옥수수를 옮긴다.

일반화 작업들

  1. 보트를 다른편으로 이동한다.
  2. 보트가 비었다면, 아이템을 실는다.
  3. 보트가 비어있지 않다면, 아이템을 내린다.

Sliding Tile Puzzles

문제: Sliding Eight

3 × 3 격자에 1-8 번호가 적힌 8개의 타일과 하나의 빈 공간으로 채워져있다.
처음에는 그리드는 뒤죽박죽으로 구성되어있다.
타일​​은 인접한 빈 공간으로 이동할 수 있고, 이동한 타일이 있던 자리는 빈 공간으로 남는다.
목표는 왼쪽 상단에 타일 1 부터 해서 순차적으로 구성되도록 그리드에 타일들을 밀는 것이다.

### The Quarrasi Lock
적대적인 외계인 Quarrasi가 지구에 착륙했다.
당신은 잡혔다.
captured.You've들이 엄청난 및 촉수 있지만 (아직 접지) 우주선을 탈출, 당신이에도 불구하고, 당신의 경비원을 제압하는 데 성공 봤는데 massivedoor를 엽니 다. 문을 열기위한 지침은 영어로 인쇄, 이상하게도 있습니다라나! - 클로이 여전히 케이크의 어떤 조각이 없습니다. 에 …

General Problem-Solving Techniques

  1. 계획한다.
  2. 문제를 다시 생각한다.
  3. 문제를 나눈다.
  4. 알고 있는 것부터 시작한다.
  5. 문제를 축소한다.
  6. 유추한다.
  7. 실험한다.
  8. 좌절하지 않는다.

이 챕터에서 사용하는 C++ 코드

#include <iostream>
using std::cin;
using std::cout;

LUHN 체크섬 검증

Luhn 공식은 식별 번호를 검증하기 위한 방법으로 널리 사용되는 시스템입니다.
짝수번째에 위치한 모든 숫자들의 값을 2배로 변환한다.
각 자리의 값들을 모두 더한다.
(두배로 변환한 값이 두 자리의 값을 갖는다면, 각 자리의 값을 더한다)
합이 10로 나눠질 경우, 식별 번호가 유효하다.

원래 식별 번호가 176248 인 경우

176248
1+(7*2)+6+(2*2)+4+(8*2)
1+(14)+6+(4)+4+(16)
1+(1+4)+6+(4)+4+(1+6)
27
--> 10으로 나눠지기 위한 값 : 3

문제 분해하기

우리는 항상 계획을 갖고 싶어하기 때문에, 우리는 이슈 목록을 만들어 하나씩 해결 해야한다

  • 각 자리수의 두배 값
  • 두배 했을 때 10이상인 값에 대한 처리
  • 수 끝에 도달했을 때 인식
  • 개별적으로 각 숫자 읽기
int doubleDigitValue(int digit) {
	int doubledDigit = digit * 2;
	int sum;
	if (doubledDigit > 10) sum = 1 + doubledDigit % 10;
	else sum = doubledDigit;
	return sum;
}

단어

riddle
수수께끼
rowboat
노 젓는 보트
shore
육지

참고

  • Think Like a Programmer - An Introduction to Creative Problem Solving


댓글