학습자료 컴퓨팅 사고력 워크북 02 패턴 인식과 일반화

패턴 인식과 일반화 — 같은 뼈대를 찾아 변수로

서로 다른 프로그램인데 만드는 순서가 놀랍도록 닮은 경우가 많습니다. 그 공통 뼈대를 찾아내는 것이 패턴 인식, 달라지는 부분만 변수로 바꿔 하나의 틀로 다시 쓰는 것이 일반화입니다. 1장에서 나눈 조각들을 나란히 놓고 이 두 기술을 훈련합니다.

1개념 정리

패턴 인식 (pattern recognition)
여러 문제나 조각에서 되풀이되는 공통 구조(뼈대)를 찾아내는 것.
일반화 (generalization)
찾은 공통 구조에서 달라지는 부분만 변수(빈칸)로 바꿔, 값만 갈아 끼우면 여러 경우에 다시 쓰는 하나의 틀로 만드는 것.

패턴을 찾으면 한 번 만든 틀을 값만 바꿔 여러 프로그램에 다시 쓸 수 있습니다.

예를 들어 숫자 맞히기 게임과 가위바위보 게임은 소재가 완전히 다르지만, 만드는 순서를 뜯어보면 같은 뼈대를 공유합니다.

그 뼈대를 하나의 틀로 만들어 두면, 다음에 비슷한 게임을 만들 때 처음부터 나누지 않고 값만 채워 넣으면 됩니다.

다만 아무 두 프로그램이나 "비슷해 보인다"고 묶는 것은 좋은 패턴 찾기가 아닙니다.

좋은 패턴 찾기와 일반화는 아래 세 가지 기준을 지켜야 합니다.

기준나쁜 예 좋은 예 확인하는 법
1. 겉이 아니라
하는 일로 묶기
둘 다 카드가 나오니 같은 패턴이라 함 — 겉모습으로 묶음 둘 다 "입력 → 비교 → 반복" 순서라 같은 패턴이라 함 소재·화면색·제목 말고, 조각이 하는 일의 순서를 비교
2. 변하는 것과
안 변하는 것 가르기
"두 게임은 그냥 다 똑같다"고 뭉뚱그림 — 차이를 못 봄 흐름(반복·비교)은 그대로, 내용(무엇을 비교하나)만 다르다고 가름 두 프로그램을 나란히 놓고 줄마다 같은지 다른지 표시
3. 변하는 것만
변수로 빼기
흐름까지 통째로 빈칸으로 만들어 뜻이 사라짐 — 너무 많이 뺌 게임마다 달라지는 값만 [입력], [비교 규칙] 같은 빈칸으로 빈칸에 각 값을 넣으면 원래 프로그램이 그대로 되살아나는지 확인

일반화가 잘 됐는지는 한 가지로 판단합니다 — 빈칸에 값을 채웠을 때 원래 프로그램들이 하나도 빠짐없이 되살아나는가. 되살아나면 성공, 무언가 빠지거나 뭉개지면 다시 손봅니다.


2예제 풀이 — 두 게임의 공통 뼈대 찾기

문제: 1장에서 나눈 "숫자 맞히기 게임"과 "가위바위보 게임"의 조각 목록을 나란히 놓고, 두 게임이 공유하는 공통 뼈대를 찾아 하나의 틀로 일반화하는 과정을 처음부터 끝까지 보여줍니다.

단계 1
두 조각 목록을 나란히 놓습니다
1장에서 두 게임을 이렇게 나눴습니다. 소재는 다르지만 목록을 나란히 놓는 것에서 시작합니다.
숫자 맞히기 게임
1. 1~100 중에서 정답을 무작위(랜덤)로 정한다
2. 사용자에게 추측 숫자를 입력받는다
3. 추측과 정답을 비교한다
4. 비교 결과에 따라 "더 큽니다 / 더 작습니다"를 보여준다
5. 정답을 맞힐 때까지 2~4를 반복한다
6. 맞히면 축하 메시지와 시도 횟수를 보여준다
가위바위보 게임
1. 사용자에게 손 모양(가위/바위/보)을 입력받는다
2. 컴퓨터의 손 모양을 무작위(랜덤)로 정한다
3. 두 손 모양을 비교해 이번 판에 누가 이겼는지 가린다
4. 이번 판 결과와 지금까지의 승수를 보여준다
5. 어느 한쪽이 2번 이길 때까지 1~4를 반복한다
6. 마지막 승자를 보여준다
단계 2
하는 일이 같은 조각끼리 짝짓습니다
순서가 조금 달라도 하는 일을 기준으로 짝을 찾습니다. 여섯 가지 역할로 깔끔하게 짝지어집니다.
공통으로 하는 일숫자 맞히기에서가위바위보에서
컴퓨터가 비교할 값을 정한다1~100 중 정답을 정한다컴퓨터 손을 정한다
사용자에게 입력을 받는다추측 숫자를 입력받는다손 모양을 입력받는다
입력과 값을 비교해 결과를 가려낸다크다/작다/같다를 비교한다규칙으로 누가 이겼는지 가린다
결과를 보여준다힌트를 보여준다이번 판 결과와 승수를 보여준다
끝 조건까지 반복한다정답을 맞힐 때까지한쪽이 2번 이길 때까지
최종 결과를 보여준다시도 횟수최종 승자
한 가지 눈여겨볼 차이 — "컴퓨터가 값을 정하는 시점"이 다릅니다. 숫자 맞히기는 시작에 한 번만 정하고, 가위바위보는 매 판 새로 정합니다. 이 차이는 단계 4에서 변수로 담아냅니다.
단계 3
공통 뼈대를 뽑아냅니다
짝지은 여섯 역할을 순서대로 이으면, 두 게임을 관통하는 하나의 뼈대가 됩니다.
1. 컴퓨터가 비교할 값을 정한다
2. 끝 조건이 될 때까지 다음을 반복한다
  2-1. 사용자에게 입력을 받는다
  2-2. 입력과 컴퓨터 값을 정해진 규칙으로 비교해 결과를 가려낸다
  2-3. 결과를 보여준다
3. 최종 결과를 보여준다
※ 아직은 두 게임에 공통인 흐름만 적었습니다. 무엇을 입력받고 무엇과 비교하는지는 게임마다 다릅니다.
단계 4
변하는 부분을 변수로 바꿔 일반화합니다
게임마다 달라지는 부분을 대괄호 [ ] 빈칸(변수)으로 바꾸면, 두 게임이 아니라 이런 종류의 게임 전체를 담는 틀이 됩니다.
1. 컴퓨터가 [비교 대상]을 정한다
2. [끝 조건]이 될 때까지 반복한다
  2-1. 사용자에게 [입력]을 받는다
  2-2. [입력]과 [비교 대상]을 [비교 규칙]으로 비교해 결과를 가려낸다
  2-3. [결과]를 보여준다
3. [최종 결과]를 보여준다
변수(빈칸)숫자 맞히기가위바위보
[입력]추측 숫자손 모양
[비교 대상]1~100 정답컴퓨터 손
[비교 규칙]크다·작다·같다가위바위보 이김 규칙
[끝 조건]정답을 맞힘한쪽이 2번 이김
[비교 대상 정하는 시점]시작에 한 번매 판
[최종 결과]시도 횟수최종 승자
점검: 빈칸에 각 열의 값을 넣으면 1장의 두 조각 목록이 그대로 되살아납니다 — 일반화 성공입니다. "정하는 시점"까지 변수로 둔 덕분에, 시작에 한 번 정하는 숫자 맞히기와 매 판 정하는 가위바위보가 같은 틀 하나에 담겼습니다.

3따라 하기 — 하이로우 카드 게임에 틀 적용

이번에는 "컴퓨터가 카드를 한 장 보여주면, 다음 카드가 그보다 높을지(하이) 낮을지(로우) 사용자가 맞히는 게임"에 앞의 일반화 틀을 적용합니다. 맞히면 계속 이어 가고, 틀리면 끝나며, 몇 장까지 이어 갔는지가 점수입니다. 물음에 하나씩 답하면서 나아갑니다.

물음 1 · 틀의 [입력] 찾기이 게임에서 공통 뼈대의 [입력]에 해당하는 것은 무엇입니까?
물음 2 · 같은 뼈대 찾기다음 여섯 프로그램 중, 하이로우와 같은 뼈대(입력 → 비교 → 끝 조건까지 반복)로 만들 수 있는 것 4개를 고릅니다. 나머지 2개는 겉은 프로그램이지만 구조가 다릅니다.
마무리 · 하이로우로 변수 채우기하이로우 게임을 일반화 틀의 빈칸에 채워 봅니다. 버튼을 눌러 내 생각과 비교해 봅시다.
변수(빈칸)하이로우 카드 게임
[입력]다음 카드가 높을지/낮을지 예측
[비교 대상]컴퓨터가 뒤집을 다음 카드
[비교 규칙]다음 카드가 예측대로 높은지/낮은지 가려냄
[끝 조건]예측이 틀림 (또는 카드가 다 떨어짐)
[비교 대상 정하는 시점]매 판
[최종 결과]이어 간 카드 장수

점검: 하이로우는 카드를 매 판 새로 뒤집으므로 "정하는 시점 = 매 판"입니다. 이 점에서 가위바위보와 같은 갈래이고, 숫자 맞히기와는 시점만 다릅니다. 소재는 카드로 완전히 새롭지만, 틀 하나로 세 게임이 모두 표현됩니다 — 이것이 일반화의 힘입니다.


4스스로 풀기

난이도를 골라 아래 입력 칸에 직접 답을 씁니다. 다 쓴 뒤 예시 답안과 비교하고, 점검 목록으로 스스로 확인합니다. 기본부터 차례로 푸는 것이 좋습니다.

문제 1 — 두 게임의 공통 뼈대 찾기
아래 두 게임입니다. ① 사칙연산 대결 — 컴퓨터가 낸 식의 답을 입력받아 맞으면 점수를 주고, 10문제를 반복한다. ② 낱말 뜻 퀴즈 — 낱말을 보여 주고 뜻을 골라 입력받아 맞으면 점수를 주고, 낱말 목록 끝까지 반복한다. (가) 하는 일이 같은 조각끼리 짝짓고 (나) 공통 뼈대를 한 틀로 쓰고 (다) 두 게임에서 달라지는 부분을 [변수]로 표시합니다.

※ 입력한 내용은 저장되지 않습니다. 남기고 싶으면 공책이나 문서에 옮겨 둡니다.

예시 답안 보기 — 반드시 먼저 쓴 뒤에 엽니다

② 공통 뼈대(틀):

1. [문제]를 낸다
2. 답을 입력받는다
3. [정답]과 비교해 맞는지 가려낸다
4. 맞으면 점수를 올리고 결과를 보여준다
5. 문제 목록 끝까지 1~4를 반복한다
6. 최종 점수를 보여준다

③ 변수: [문제] — 사칙연산 식 / 낱말과 뜻,   [정답] — 계산 결과 / 올바른 뜻.

나머지(답 입력받기·채점·점수·반복)는 두 게임이 똑같으므로 틀에 그대로 둡니다. 이 부분까지 변수로 빼면 뜻이 사라집니다.

스스로 점검
문제 2 — 게임이 아닌 프로그램에도 통하는가
두 관리 프로그램입니다. ① 출석 부르기 — 반 명단의 이름을 하나씩 보여 주고 출석/결석을 입력받아 기록한다. ② 우유 신청 받기 — 반 명단의 이름을 하나씩 보여 주고 신청/미신청을 입력받아 기록한다. (가) 공통 뼈대를 뽑고 (나) 빈칸 있는 하나의 틀로 일반화하고 (다) 세 번째 프로그램 "좋아하는 과목 설문 받기"에 그 틀을 적용해 값을 채웁니다.

※ 입력한 내용은 저장되지 않습니다. 남기고 싶으면 공책이나 문서에 옮겨 둡니다.

예시 답안 보기 — 반드시 먼저 쓴 뒤에 엽니다

① 공통 뼈대(틀):

1. 명단을 불러온다
2. 명단 끝까지 다음을 반복한다
  2-1. 다음 이름을 보여준다
  2-2. 그 사람에게 [질문]의 답을 입력받는다
  2-3. 답을 기록한다
3. 결과표를 보여준다

② 변수: [질문]·[답의 종류]·[결과표 형식].

③ 설문 받기 적용: [질문] = "좋아하는 과목", [답의 종류] = 과목 이름. 나머지 흐름은 그대로 — 값만 바꿔 끼우면 완성됩니다.

이 뼈대는 게임 루프와 다른 '명단 훑기' 종류입니다. 그래도 공통 뼈대를 찾아 변수로 빼는 일반화 기술 자체는 게임이든 아니든 똑같이 통합니다.

스스로 점검
문제 3 — 억지로 하나로 묶으면
누군가 "둘 다 반복이 있으니, 하이로우 게임 뼈대와 출석 부르기 뼈대를 하나의 틀로 합치자"고 합니다. (가) 두 뼈대의 반복이 각각 무엇을 기준으로 끝나는지 비교합니다. (나) 억지로 한 틀에 합칠 때 생기는 문제를 적습니다. (다) 두 패턴을 어떻게 구분해 이름 붙일지 제안합니다. 덧붙여, 변수로 뺄 수 있는 것뺄 수 없는 것(흐름 자체)을 가릅니다.

※ 입력한 내용은 저장되지 않습니다. 남기고 싶으면 공책이나 문서에 옮겨 둡니다.

예시 답안 보기 — 반드시 먼저 쓴 뒤에 엽니다

① 끝 기준 비교: 하이로우 뼈대의 반복은 [끝 조건 — 예측이 틀림]에서 멈추고, 매 번 사용자 예측을 컴퓨터 값과 비교해 가려냅니다. 출석 부르기 뼈대의 반복은 [명단의 끝]에서 멈추고, 비교보다 기록이 중심입니다.

② 억지로 합치면: "언제 끝나는가"가 두 갈래(끝 조건 / 목록의 끝)로 뭉개져 빈칸이 늘고, 오히려 더 헷갈립니다. 하나의 틀이 두 가지를 다 담으려다 어느 쪽도 깔끔히 되살리지 못합니다.

③ 이름 제안: '비교 반복형'(입력을 값과 비교해 끝 조건까지 반복)과 '목록 훑기형'(명단을 끝까지 훑으며 기록) 두 패턴으로 나눠 이름 붙이는 편이 낫습니다.

④ 뺄 수 있는 것 / 없는 것: 흐름(반복·비교·기록의 순서) 자체는 변수로 뺄 수 없습니다 — 그 순서가 곧 패턴의 정체이기 때문입니다. 변수로 뺄 수 있는 것은 그 흐름 안에서 달라지는 값(입력 종류·비교 대상·끝 조건의 구체적 내용)뿐입니다.

스스로 점검
돌아보기 — 채점하지 않습니다
스스로 풀기를 마친 뒤, 공책에 짧게 답해 봅니다. 맞고 틀림을 가리지 않는 성찰 질문입니다.
① 세 문제 중 어디에서 가장 막혔고, 무엇을 바꾸었을 때 풀렸습니까?
② 세 문제에서 공통으로 쓴 방법은 무엇입니까? (공통 뼈대 찾기 → 달라지는 것만 변수로 빼기 — 지금 한 이 사고가 바로 패턴 인식과 일반화입니다.)
③ 다음에 새 프로그램을 만나면, 패턴을 찾기 위해 무엇부터 하겠습니까?
더 알아보기 — 매개변수, 중복 제거(DRY), 디자인 패턴

1. 변수의 실제 이름 — 매개변수와 인자

이 장에서 만든 틀의 빈칸 [ ]은 실제 개발에서 함수의 매개변수(parameter)가 됩니다.

예를 들어 일반화 틀을 playGuessGame(비교대상, 비교규칙, 끝조건) 같은 함수로 만들 수 있습니다.

함수를 부를 때 빈칸에 실제로 넣는 값(예: "1~100 정답")을 인자(argument)라고 부릅니다.

2. 같은 코드를 두 번 쓰지 않기 — DRY 원칙

같은 뼈대를 게임마다 새로 만들면 코드가 겹치고, 한 곳을 고칠 때 여러 곳을 함께 고쳐야 합니다.

그래서 소프트웨어 공학에는 DRY 원칙(Don't Repeat Yourself — 반복하지 마라)이 있습니다.

겹치는 부분을 하나의 틀(함수)로 모으는 일을 중복 제거라고 하며, 패턴 인식과 일반화가 그 첫 단계입니다.

3. 문제 해결의 되풀이되는 틀 — 디자인 패턴

프로그램을 만들다 보면 여러 상황에서 똑같은 구조가 자꾸 나타납니다.

자주 나타나는 좋은 구조에 이름을 붙여 모아 둔 것을 디자인 패턴(design pattern)이라고 합니다.

이 장에서 '비교 반복형'과 '목록 훑기형'에 이름을 붙인 것이 바로 패턴에 이름을 주는 연습입니다.


자가진단

개념을 새 상황에 적용하는 문제입니다. 답을 고르면 즉시 채점과 해설이 나옵니다. ↻ 다시를 눌러 여러 번 풀 수 있습니다.

Q1 · 개념여러 프로그램에서 공통 뼈대를 찾아 하나의 틀로 만드는 까닭으로 가장 알맞은 것은 무엇입니까?
Q2 · 적용"숫자 맞히기"와 "가위바위보"의 공통 뼈대에서, 두 게임이 서로 달라서 변수로 빼야 하는 부분은 무엇입니까?
Q3 · 판단다음 중 겉모습이 아니라 하는 일로 올바르게 패턴을 묶은 것은 무엇입니까?
Q4 · 구분여러 "○○ 퀴즈" 프로그램을 하나의 틀로 일반화할 때, 변수(빈칸)로 빼기에 가장 알맞은 것은 무엇입니까?

핵심 정리

같은 뼈대를 찾아 변수로 일반화한다
  • 패턴 인식은 겉모습이 아니라 하는 일의 구조로 묶는 것입니다. 소재·화면·제목이 아니라 조각이 하는 일의 순서를 봅니다.
  • 일반화는 흐름은 그대로 두고 달라지는 값만 변수(빈칸)로 빼는 것입니다. 흐름까지 빼면 뜻이 사라집니다.
  • 잘 된 일반화는 빈칸에 값을 넣으면 원래 프로그램들이 되살아납니다. 안 맞는 것을 억지로 한 틀에 합치지 않습니다.

이 장이 참고한 자료