Computational thinking

Table of contents

  1. 프로그래밍이 어려운 점 두 가지
  2. 논리 연습
  3. 논리와 증명
  4. 수와 표현
  5. 집합과 조합론
  6. 기초 수식
  7. 재귀
  8. 동적 프로그래밍
  9. 조합론 프로그래밍
  10. 기초 프로그래밍

프로그래밍이 어려운 점 두 가지

  • 프로그래밍 언어 문법과 라이브러리 사용
    • 배울 때 약간의 어려움이 있지만 훈련에 비례하여 실력이 느는 경향이 있음
  • 논리
    • Hard logic vs Soft logic
    • 프로그래밍은 hard logic 을 사용한다.
    • 직관은 논리적인 느낌을 주는것
    • 직관은 장잠은 빠르지만 단점은 정확하지 않고 강한 착각을 일으킨다.
    • Soft logic 으로 알고리즘을 이해하려 하면 직관적으로 이해되는 알고리즘이 있지만 직관으로 완전한 이해를 얻는것은 사실상 불가능하다.
  • 증명
    • 많은 오해가 p -> q 와 p <-> 를 혼동하는 것에서 일어난다.
    • 대부분
  • 수학적 귀납법

논리 연습

  • 다음 명제식 형태로 쓰고 참인지 거짓인지 판단하시오
    1. 만약 0이 홀수라면, 미국에서 2080년 월드컵이 열린다.
    2. 만약 1984893490239409이 Prime number 라면 2는 짝수다.
  • p -> q 가 거짓이라고 하자. 다음 명제식의 참 거짓은 어떻게 되는가?
    • ~p -> q : T
    • p v q : T
    • q -> p : T
  • 다음 명제들의 역, 이, 대우를 쓰시오
    1. 만약 0이 홀수라면, 미국에서 2080년 월드컵이 열린다.
    2. 만약 1984893490239409이 Prime number 라면 2는 짝수다.
  • 다음 명제식의 진리표를 만드시오
    • p ∧ (q -> ~p)
    • (p ∧ ~q) -> r

논리와 증명

  • 항진명제 임을 진리표를 이용하여 보이시오
    • ~(~p ∧ q) v q
    • (~p v q) v (p ∧ ~q)
  • 모순명제 임을 진리표를 이용하여 보이시오
    • (~p v q) ∧ (p ∧ ~q)
    • (p ∧ q) ∧ (p ∧ ~q)
  • 두 명제가 동등한지 진리표로 확인
    • p ∧ (p v q) == p
    • ~p v ~q == ~(p v q)
  • 명제식 변형으로 간소화
    • (p ∧ ~q) v (p ∧ q)
    • (p v ~q) ∧ (~p v ~q)
  • 참인지 확인. R 은 실수의 집합, Z 는 정수의 집합
    • ∀x ∈ R, X^2 >= x
    • ∀x ∈ Z, X^2 >= x
    • ∃x ∈ R, X^2 < x
    • ∃x ∈ Z, X^2 < x
  • n 이 짝수이면 3n + 5 이 홀수임을 증명
  • n 이 홀수이면 n^2 + n 은 짝수 임을 증명
  • m 이 짝수 이고 n 이 홀수이면 2m + 3n 은 홀수 임을 증명
  • (대우 증명) 자연수 n 에 대해서 n^2 + 5 가 홀수이면 n 이 짝수임을 증명
  • n^2 이 짝수이면 n 이 짝수임을 증명
  • 자연수 n 에 대해서 n^2 + 5n + 3은 항상 홀수 임을 증명
  • n^2 이 3의 배수이면 n 은 3 의 배수임을 증명
  • n 이 홀수이면 n^2 을 8로 나눈 나머지는 1임을 증명
  • 어떤 자연수를 제곱해도 그 결과를 3으로 나눈 나머지는 2가 아님을 증명 하라
  • (귀류법) 유리수와 무리수의 합은 무리수임을 증명 하라
  • \sqrt[2]{n} 이 무리수 임을 증명하라
  • log2(5) 는 무리수임을 증명하라
  • 수학적 귀납법 : 1 + 2 + 3 + 4 + … + n = n*(n+1)/2 을 증명하라
  • 1^2 + 2^2 + 3^2 + 4^2 + … + n^2 = n*(n+1)(n+2)/6 을 증명하라
  • r != 1 일 때 sum(0~n) \sum_{i=0}^{n} r^i = \frac {r^{n+1}-1} {r-1} 임을 증명하라
  • 2 이상의 자연수 n 에 대해서 n^3 - n 은 6으로 나누어 떨어짐을 증명하라
  • 2 이상의 자연수 n 에 대해서 \sqrt n < \frac {1}{\sqrt 1} + \frac {1}{\sqrt 2} + ... + \frac {1}{\sqrt n} 을 증명하라
  • nxn 체스판에서 감염되지 않은 칸은 인접 칸들 중 2개 이상이 감염일 때 감염된다. 모두 감염 시키기 위해서 초기에 n 칸 이상이 감염 되어 있어야 함을 증명하라.

수와 표현

  • 2진수 표현에서 log n 비트로 표현 할 수 있는 숫자 범위는
  • 스무고개에서 맞출 수 있는 답의 종류는?
  • n 이 충분히 큰 값일 때 다음중 어느 값이 더 큰가?
    • 2n ?? n^2
    • 2^{\frac {n}{2}} ?? \sqrt {}{3^n}
    • 2^{n\log n} ?? n!
    • \log 2^{2n} ?? n \sqrt{}{n}
  • x = \log_{a} yz 일 때 x 를 2를 밑으로 하는 로그로 표현하시오. 단, 로그 함수의 인자는 모두 문자 하나여야 한다.
  • 다음 함수들의 역함수를 구하시오
    • f(x) = log(x-3) - 5
    • f(x) = 3log(x+3) + 1
    • f(x) = 2 x 3^x - 1

집합과 조합론

  • \binom{n}{k} + \binom{n}{k - 1} = \binom{n + 1}{k}
  • 수학적 귀납법으로 증명 : (x + y)^n = \sum_{k=0}^{n} \binom{n}{k}x^{n-k}y^k
  • 결과를 이용하여 n 개의 원소를 가진 집합의 가능한 부분집합의 종류는 2^n 개임을 증명하라
  • 귀류법을 이용하여 증명 : (A-B)∩(B-A) = ∅
  • 두 집합이 다르다는 것을 명제와 동치임을 증명하라. 증명에는 앞에서 설명한 내용과 기본 논리만 사용한다.
    • ∃x (x ∈ A ∧ x ∉ B) v (x ∈ B ∧ x ∉ A)
  • 다음이 사실임을 증명하라.
    • (A ∪ B) ∩ (A ∩ B)^c = (A - B) ∪ (B - A)
  • (A⨁B) 는 합집합에서 교집합을 뺀것을 말한다. (A⨁B)⨁B = A 이 항상 성립함을 증명하라
  • 8x8 체스판에 똑같은 말 두개를 놓으려 한다. 가능한 방법은 몇가지 인가?
  • n 개의 원소를 가진 집합의 가능한 부분집합의 종류는 2^n 개임을 조합론을 이용해 증명하라
  • 비밀번호를 0-9 까지의 숫자를 가지고 만들 때 각 숫자는 한번만 사용할 수 있다 4개 이상 6개 이하의 숫자를 쓸 수 있을 때 가능한 비밀번호의 가짓수는?
  • 52개의 트럼프 한 세트에서 5장 카드의 조합은 몇가지 인가?
  • 52개 한 셋트 5개의 카드 조합 중 같은 무늬 카드가 정확히 3개인 경우는 몇가지 인가?
  • x + y + z = 100 의 자연수 해는 몇가지 인가?
  • (포함 배제의 원리) 5개의 원소를 가진 집합에서 3개의 원소를 가진 집함으로 가는 전사 함수는 몇가지가 있는가?
  • 52개의 카드에서 5개 조합을 만들 때 숫자가 같은 카드가 한 쌍도 없는 경우는 몇가지 인가?
  • n 개의 원소를 가진 배열에서 연속된 구간을 잡으려고 한다. 잡을 수 있는 가능한 구간은 몇가지 인가? 단 구간의 크기는 1 이상이다.

기초 수식

다음 재귀 식들은 O() notation 수준으로 풀어라.

  • T(n) = T(n - 1) + 1
  • T(n) = T(n - 1) + n
  • T(n) = T(n - 1) + \log n
  • T(n) = T(\frac {n} {2}) + 1
  • T(n) = T(\frac {n} {2}) + n
  • T(n) = 2T(\frac {n} {2}) + n
  • T(n) = 3T(\frac {n} {2}) + n
  • T(n) = T(n-1) + \frac {1}{n}
  • T(n) = T(n/2) + T(n/4) + T(n/6) + T(n/12) + 1
  • T(n) = \sqrt{}{n} \cdot T(\sqrt{}{n}) + n

재귀

다음 문제들을 푸는 재귀 알고리즘을 수도 코드로 작성하고, 정확성 증명 및 시간 복잡도 계산을 수행하라

  • 피보나치 수열 : F(n) = F(n-1) + F(n - 2), F(1) = F(2) = 1
  • Merge sort
  • 다음 소팅 알고리즘이 항상 성공한다는 것을 증명하라
    def stupid(arr):
      if len(arr) == 2 and arr[0] > arr[1]:
          arr[0], arr[1] = arr[1], arr[0]
      else:
          m = ceiling(2n/3)
          stupid(arr[0:m-1])
          stupid(arr[len(arr)-m:n-1])
          stupid(0:m-1)
    
  • 위의 알고리즘에서 swap 의 횟수는 최대 몇번 인가?
  • 어떤 배열 A[1..n] (음수 포함, asc 정렬됨) 잇음. A[i] 가 i 가 되는 알고리즘을 수도코드로 작성하고 증명 및 시간 복잡도를 증명하라. 자연수로 제한되면 어떻게 풀 수 있는가?
  • 루트에 있는 트리를 입력으로 받아 아래와 같이 출력하는 알고리즘을 작성하라. 1000미만의 자연수가 저장되어 있다. 트리를 출력하라.
    [030]--+--[054]-----[001]
         +--[002]
         o--[045]-----[123]
    
  • 무한한 크기의 물통 3개가 있다 초기에는 자연수 만큼의 물이 들어 있다. 가능한 작업은 두개의 물통을 잡아서 그 중 많거나 같은 양의 물이 들어 이는 곳에서 작으 ㄴ쪽으로 물을 부어서 작은 쪽의 물의 양을 두배로 만드는 것이다. 즉, 4리터, 3리터를 잡았다면 1리터 6리터가 될 것이다. 입력으로 초기 물의 양을 받아서 한 물통에 들어 있는 물의 양을 0 리터로 만들고 싶다. (실행 시간이 많이 걸려도 좋으니) 그렇게 만드는 과정을 계산하는 알고리즘을 작성하라.

동적 프로그래밍

다음 문제들을 푸는 동적 프로그래밍 알고리즘을 수도 코드로 작성하고 정확성 및 시간 복잡도 계산을 수행하라

  • Memozation 피보나치 수열
  • Dynamic programming 피보나치 수열
  • 실제로 실행 시키면 어느것이 가장 빠를 것으로 예상 되는가?
  • 행열 곱하기 n 개의 행열을 곱하려고 한다. 크기가 axb 인 행열과 크기가 bxc 인 행열을 곱하는데 드는 계산량을 axbxc 라고 한다. n 개의 행열들을 곱하는데 필요한 계산량을 최소화 하는 순서를 찾는 알고리즘을 작성하라. 행열들의 크기는 다르고, 입력으로 주어진다고 가정하라.
  • 배열에 정수(음수 포함) 들이 저장되어 있다. 연속인 구간들 중 그 합이 가장 큰 구간을 찾는 알고리즘을 작성하라. 구간의 크기는 1이상이 허용된다.
  • 배열에 정수 들이 저장되어 있다 배열의 일부 값들을 골라서 배열에 있는 순서대로 보면 증가하는 순서가 될 수 있다. 이러한 것들 중 가장 긴 것을 찾는 알고리즘을 작성하라.

조합론 프로그래밍

  • 52장의 카드에서 만들 수 있는 페어가 정확히 하나만 있는 5장 조합을 모두 출력하는 프로그래밍을 만들어라. 출력이 많으면 카드를 줄일 수 있다.
  • x + y + z = 100 의 자연수 해를 모두 출력하는 프로그램을 작성하라.
  • m 개의 원소를 가진 집합에서 n 개의 원소를 가진 집합으로 가는 전사함수의 갯수를 출력하는 프로그램을 작성하라. m 과 n 의 값을 바꾸어 보면서 값이 너무 커지지 않는 입력의 범위가 어느 정도인지 확인하라.
  • m 개의 원소를 가진 집합에서 n 개의 원소를 가진 집합으로 가는 전사 함수를 모두 출력하는 프로그램을 작성하라. 출력을 어떻게 하는 것이 적절할 지 생각해 보아야 한다.

기초 프로그래밍

  • 피보나치 수열을 계산하는 3가지 방법을 모두 작성하고 실행시간을 비교하라.
  • n 개의 행열 을 곱하려고 한다. axb 인 행열과 bxc 인 행열을 곱하는데 드는 계산량을 axbxc 라고 한다. n 개의 행렬 들을 곱하는데 필요한 계산량을 최소화 하는 순서를 찾는 알고리즘을 작성하라. 행렬들의 크기는 다르고 입력으로 주어진다고 가정하라.
  • 배열에 정수(음수포함) 들이 저장되어 있다. 연속인 구간들 중 그 합이 가장 큰 구간을 찾는 프로그램을 작성하라.
  • 배열에 정수 (음수포함) 이 있다. 배열의 일부 값을골라서 배열에 있는 순서대로 보면 증가하는 순서가 될 수 있다. 이런한 것들 중 가장 긴 것을 찾는 프로그램을 작성하라.
  • 루트에 있는 트리를 입력으로 받아 아래와 같이 출력하는 프로그램을 작성하라. 1000 미만의 자연수가 저장되어 있다. 트리의 노드 연결 관계를 다음과 같이 표현해야 한다. 아래 출력에서 루트는 자식이 3개 있고 그 자식들 중 하나는 더이상 자식이 없는 것임을 알 수 있다.
    [030]--+--[054]-----[001]
         +--[002]
         o--[045]-----[123]