학습자료 › 컴퓨팅 사고력 워크북 › 01 문제 분해

문제 분해 — 프로그램은 조각으로 만든다

큰 프로그램은 바로 만들 수 있는 작은 조각으로 나눈 뒤 하나씩 만듭니다.

1개념 정리

문제 분해decomposition큰 문제를 바로 만들 수 있는 조각으로 나누기
숫자 맞히기 게임
정답을
정한다
추측을
입력받는다
정답과
비교한다
힌트를
보여준다

조각 1개 = 함수(function) 1개

작은 조각은만들기 쉽고확인하기 쉽고고치기 쉽습니다

좋은 분해인지 세 가지로 점검합니다

✗ 나쁜 분해
✓ 좋은 분해
1빠짐없이다 모으면 원래 문제가 됩니까?
✗ 나쁜 분해
게임
?
입력
받는다
?
힌트를
준다
✓ 좋은 분해
게임
정답을
정한다
입력
받는다
비교
한다
힌트를
준다
2겹치지 않게두 조각이 같은 일을 합니까?
✗ 나쁜 분해
게임
결과를
보여준다
=
이긴 사람을
띄운다
✓ 좋은 분해
게임
이긴 사람을
가린다
결과를
보여준다
3바로 시작할 수 있게읽자마자 첫 동작이 떠오릅니까?
✗ 나쁜 분해
게임
게임을 재미있게
만든다
✓ 좋은 분해
게임
점수를
1 올린다
효과음을
낸다

막막한 조각은 한 번 더 나눕니다. 세 가지를 모두 통과하면 나누기를 멈춥니다.


2예제 풀이 — 숫자 맞히기 게임 분해

힌트를 받으며 숫자를 맞히는 게임을 나눕니다.

1한 문장으로 씁니다

"컴퓨터가 1~100 사이 숫자를 하나 정하면, 사용자가 그 숫자를 맞힐 때까지 추측을 입력하고, 컴퓨터는 매번 '더 큽니다/더 작습니다' 힌트를 준다."

입력 = 받는 것처리 = 하는 일출력 = 보여주는 것
2입력 · 처리 · 출력으로 가릅니다
입력추측 숫자
처리정답 정하기 · 횟수 세기 · 비교 · 반복
출력힌트 · 축하 · 시도 횟수
3조각으로 나눕니다
숫자 맞히기 게임
1정답을
무작위(랜덤)로
정한다
2추측 숫자를
입력받는다
3시도 횟수를
1 늘린다
4추측과 정답을
비교한다
5힌트를
보여준다
↻ 6 맞힐 때까지 2~5를 반복한다
7축하와 시도
횟수를 보여준다

조각마다 ‘~한다’ 동작 한 개

4세 기준으로 점검합니다
  • ✓ 빠짐없이문장 속 일이 모두 조각에 있습니다.
  • ✓ 겹치지 않게비교(4)와 보여주기(5)는 서로 다른 일입니다.
  • ✓ 바로 시작조각마다 첫 동작이 바로 떠오릅니다.

3따라 하기 — 가위바위보 게임 분해

예제와 같은 순서로 가위바위보 게임을 나눕니다.

물음 1 · 단계 2 — 입력 찾기이 게임에서 사용자에게 받는 입력은 무엇입니까?
물음 2 · 단계 3 — 조각 고르기후보 카드에서 진짜 조각 4장을 골라 빈칸을 채웁니다.
가위바위보 게임
빈칸
빈칸
빈칸
빈칸
마무리 · 단계 3~4 — 완성 분해두 물음의 답을 반영한 완성 분해입니다.
가위바위보 게임
1손 모양을
입력받는다
2컴퓨터 손을
무작위로 정한다
3누가 이겼는지
가린다
4이긴 횟수를
기록한다
5결과와 이긴
횟수를 보여준다
↻ 6 한쪽이 2번 이길 때까지 1~5를 반복한다
7마지막 승자를
보여준다
✓ 빠짐없이✓ 겹치지 않게✓ 바로 시작

‘정정당당하게’, ‘재미있게’ 같은 목표나 마음가짐은 조각이 아닙니다.


4스스로 풀기

난이도를 골라 빈 나무를 채운 뒤, 예시 답안과 점검 목록으로 확인합니다.

문제 1 — 출석 부르기 프로그램
반 학생 이름을 차례로 부르고 출석·결석을 기록하는 프로그램을 나눕니다.
1할 일 한 문장
2입력 · 처리 · 출력
3조각 나무 5~7개, ‘~한다’로 끝나게

※ 입력한 내용은 저장되지 않습니다. 빈칸은 남겨도 됩니다.

예시 답안 보기 — 먼저 채운 뒤에 엽니다

한 문장: 반 학생 이름을 순서대로 하나씩 보여주고, 출석/결석 입력을 받아 기록한 뒤, 마지막에 출석 결과표를 보여준다.

입력학생 명단 · 출석/결석 대답
처리다음 이름 고르기 · 기록하기 · 끝까지 반복
출력이름 표시 · 결과표
출석 부르기 프로그램
  1. 1학생 명단을 불러온다
  2. 2명단에서 다음 이름을 화면에 보여준다
  3. 3출석/결석 입력을 받는다
  4. 4입력받은 결과를 기록한다
  5. 5명단이 끝날 때까지 2~4를 반복한다
  6. 6출석 결과표를 보여준다

예시와 표현이 달라도 괜찮습니다. 아래 점검 목록을 통과하는지가 기준입니다.

스스로 점검
문제 2 — 학급 문고 대출 프로그램
학급 문고의 책 대출과 반납을 관리하는 프로그램을 묶음(기능) → 조각 2층으로 나눕니다.
1할 일 한 문장
2묶음 → 조각 나무
3기억해야 하는 정보 데이터

※ 입력한 내용은 저장되지 않습니다. 빈칸은 남겨도 됩니다.

예시 답안 보기 — 먼저 채운 뒤에 엽니다

한 문장: 학급 문고의 책을 등록해 두고, 누가 어떤 책을 빌리고 반납했는지 기록하며, 현재 상태를 조회할 수 있게 한다.

학급 문고 대출 프로그램
  1. 1책 등록 기능
    1. 1-1책 제목과 관리 번호를 입력받는다
    2. 1-2책 목록에 추가한다
  2. 2대출 기능
    1. 2-1빌리는 사람 이름과 책 번호를 입력받는다
    2. 2-2그 책이 대출 가능한지 확인한다
    3. 2-3대출 기록을 남기고 책 상태를 ‘대출 중’으로 바꾼다
  3. 3반납 기능
    1. 3-1반납할 책 번호를 입력받는다
    2. 3-2책 상태를 ‘대출 가능’으로 바꾸고 반납 날짜를 기록한다
  4. 4조회 기능
    1. 4-1전체 책 목록과 상태를 보여준다
    2. 4-2특정 사람이 빌린 책을 찾아 보여준다

기억해야 하는 정보: 책 목록(제목·관리 번호·상태), 대출 기록(누가·어떤 책을·언제 빌리고 반납했는지)

묶음을 가른 기준은 ‘사용자가 하려는 일’입니다. 기준이 하나로 통일되면 조각이 겹치기 어렵습니다.

스스로 점검
문제 3 — 분실물 찾기 앱 기능 나누기
우리 학교 분실물 찾기 앱의 기능을 3층 나무(큰 기능 → 작은 기능 → 바로 만들 단위)로 나눕니다.
1나누기 기준 1층을 무엇으로 나눴는지
23층 나무 맨 아래 칸마다 필요한 데이터

※ 입력한 내용은 저장되지 않습니다. 빈칸은 남겨도 됩니다.

예시 답안 보기 — 먼저 채운 뒤에 엽니다

나누기 기준: 사용자가 하는 일의 순서(주운 물건을 올린다 → 잃어버린 사람이 찾는다 → 서로 연락해 돌려받는다)

분실물 찾기 앱
  1. 1주운 물건 올리기 기능
    1. 1-1물건 정보 입력
      1. 1-1-1사진을 찍어 올린다사진 파일
      2. 1-1-2물건 종류·주운 장소·날짜를 고른다종류, 장소, 날짜
    2. 1-2올린 물건 목록 관리
      1. 1-2-1새 물건을 목록에 추가한다물건 목록
      2. 1-2-2주인을 찾은 물건을 ‘해결됨’으로 표시한다상태
  2. 2검색 기능
    1. 2-1조건으로 찾기
      1. 2-1-1종류·장소·날짜로 목록을 거른다검색 조건
      2. 2-1-2결과를 최신 것부터 보여준다늘어놓는 순서
  3. 3연락 기능
    1. 3-1쪽지 보내기
      1. 3-1-1물건을 올린 사람에게 쪽지를 남긴다쪽지 내용
      2. 3-1-2새 쪽지가 오면 알림을 보여준다알림 목록

기준을 ‘화면 단위’나 ‘정보 종류’로 잡아도 좋은 답이 됩니다. 다만 기준은 하나로 통일해야 어떤 기능이 어느 가지에 들어갈지 헷갈리지 않습니다.

스스로 점검
돌아보기 — 채점하지 않습니다. 공책에 짧게 답합니다.
1가장 막힌 곳은 어디였고, 무엇을 바꿔서 풀었습니까?
2세 문제에서 공통으로 쓴 방법은 무엇입니까?
3다음에 큰 문제를 만나면 무엇부터 하겠습니까?

한 문장 → 입력·처리·출력 → 조각 → 점검. 이 순서로 생각하는 것이 문제 분해입니다.

더 알아보기 — 함수와 모듈, 응집과 결합, 분할정복

1. 조각의 실제 이름 — 함수와 모듈

대출 기능모듈(module)
책 번호를
입력받는다함수
대출 가능한지
확인한다함수
책 상태를
바꾼다함수

조각 하나는 함수 하나가 됩니다. 예제의 ‘추측과 정답을 비교한다’는 compare(guess, answer) 같은 함수가 됩니다.

함수 여러 개가 모여 하나의 기능을 이루면 모듈(module)이라고 부릅니다. 문제 2의 대출·반납 묶음이 모듈입니다.

2. 좋은 분해의 전문 용어 — 응집과 결합

높은 응집(cohesion): 조각 하나는 한 가지 일만 한다.

낮은 결합(coupling): 조각 하나를 고쳐도 다른 조각을 고칠 필요가 없다.

심화 문제 점검 목록의 마지막 두 항목이 바로 이 두 기준입니다.

3. 나누기를 끝까지 밀어붙이면 — 분할정복

문제를 절반으로 나누고, 그 절반을 또 나누기를 되풀이하는 전략을 분할정복(divide and conquer)이라고 합니다.

정렬된 1,000쪽짜리 사전에서 한가운데를 펼쳐 절반을 버리기를 되풀이하면, 열 번 이내에 원하는 쪽에 도달합니다(이진탐색). 많은 정렬·탐색 알고리즘이 이 전략을 씁니다.


자가진단

답을 고르면 바로 채점과 해설이 나옵니다.

Q1 · 개념문제를 먼저 분해하는 이유로 가장 알맞은 것은 무엇입니까?
Q2 · 적용‘단어 암기 퀴즈 프로그램’의 조각 가운데 바로 만들기 시작할 수 있는 것은 어느 것입니까?
Q3 · 점검아래 분해를 세 기준으로 점검할 때 문제점은 무엇입니까?
덧셈 연습 프로그램
문제를
만든다
답을
입력받는다
채점한다
입력된 답이
맞는지 확인한다
Q4 · 판단‘게임 화면을 만든다’ 조각 앞에서 무엇부터 할지 막막합니다. 어떻게 해야 합니까?
게임
점수를
1 올린다
게임 화면을
만든다
효과음을
낸다

핵심 정리

프로그램은 조각으로 만든다
1할 일 한 문장
2입력·처리·출력
3‘~한다’ 조각 나무
4세 기준 점검
빠짐없이겹치지 않게바로 시작할 수 있게

조각 1개 = 함수 1개 · 막막한 조각은 한 번 더 나눕니다

이 장이 참고한 자료