career

κ³ λŸ‰μ£Ό 12μ£Ό μŠ€ν„°λ”” 컀리큘럼 0μ£Όμ°¨ CS50 μˆ˜κ°•

seulye 2022. 10. 13. 14:30

λͺ¨λ‘λ₯Ό μœ„ν•œ 컴퓨터 κ³Όν•™ (CS50 2019) κ°•μ’Œμ†Œκ°œ : λΆ€μŠ€νŠΈμ½”μŠ€ (boostcourse.org)

 

λͺ¨λ‘λ₯Ό μœ„ν•œ 컴퓨터 κ³Όν•™ (CS50 2019)

λΆ€μŠ€νŠΈμ½”μŠ€ 무료 κ°•μ˜

www.boostcourse.org

컴곡 μ „κ³΅μžλΌμ„œ ꡳ이 μ•ˆ 듀어도 λ˜μ§€λ§Œ.. μ΄ˆμ‹¬μ„ 되찾고자 ν•˜λŠ” 마음으둜 λ“€μ–΄λ³΄μ•˜λ‹€. 

κ·Έ μ€‘μ—μ„œ μ •λ¦¬ν•΄λ†“μœΌλ©΄ 쒋을 것 같은 것듀을 λͺ¨μ•„λ΄„!

 

 

λΉ„νŠΈ

정보λ₯Ό μ €μž₯ν•˜κ³  연산을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ»΄ν“¨ν„°λŠ” λΉ„νŠΈ(bit)λΌλŠ” μΈ‘μ • λ‹¨μœ„λ₯Ό μ”λ‹ˆλ‹€. λΉ„νŠΈλŠ” μ΄μ§„ μˆ«μžλΌλŠ” λœ»μ„ κ°€μ§„ “binary digit”의 μ€„μž„λ§μ΄λ©°, 0κ³Ό 1, λ‘ κ°€μ§€ κ°’λ§Œ κ°€μ§ˆ 수 μžˆλŠ” μΈ‘μ • λ‹¨μœ„μž…λ‹ˆλ‹€. 

 

λΉ„νŠΈμ—΄

λ°”μ΄νŠΈ(byte)λŠ” μ—¬λŸ 개의 λΉ„νŠΈκ°€ λͺ¨μ—¬ λ§Œλ“€μ–΄μ§„ κ²ƒμž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ λ°”μ΄νŠΈμ— μ—¬λŸ 개의 λΉ„νŠΈκ°€ 있고, λΉ„νŠΈ ν•˜λ‚˜λŠ” 0κ³Ό 1둜 ν‘œν˜„λ  수 있기 λ•Œλ¬Έμ— 2^8 = 256 κ°œμ˜ μ„œλ‘œ λ‹€λ₯Έ λ°”μ΄νŠΈκ°€ μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°”μ΄νŠΈκ°€ λͺ¨μ΄λ©΄ 더 큰 λ‹¨μœ„κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. ν‚¬λ‘œλ°”μ΄νŠΈλŠ” 1,000 λ°”μ΄νŠΈ, λ©”κ°€λ°”μ΄νŠΈλŠ” 1,000 ν‚¬λ‘œλ°”μ΄νŠΈ(100만 λ°”μ΄νŠΈ), κΈ°κ°€λ°”μ΄νŠΈλŠ” 1,000 λ©”κ°€λ°”μ΄νŠΈ(10μ–΅ λ°”μ΄νŠΈ)μž…λ‹ˆλ‹€. ν…ŒλΌλ°”μ΄νŠΈλŠ” 1,000 κΈ°κ°€λ°”μ΄νŠΈ(1μ‘° λ°”μ΄νŠΈ)이며, 심지어 νŽ˜νƒ€λ°”μ΄νŠΈμ™€ μ—‘μ‚¬λ°”μ΄νŠΈμ™€ 같은 더 큰 λ‹¨μœ„λ„ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

 

μ•„μŠ€ν‚€μ½”λ“œ

 

데이터 νƒ€μž…

  • bool (1λ°”μ΄νŠΈ) : λΆˆλ¦¬μ–Έ ν‘œν˜„, (예) True, False, 1, 0, yes, no
  • char (1λ°”μ΄νŠΈ) : 문자 ν•˜λ‚˜ (예) 'a', 'Z', '?'
  • string: λ¬Έμžμ—΄
  • int (4λ°”μ΄νŠΈ) : νŠΉμ • 크기 λ˜λŠ” νŠΉμ • λΉ„νŠΈκΉŒμ§€μ˜ μ •μˆ˜ (예) 5, 28, -3, 0
  • long (8λ°”μ΄νŠΈ) : 더 큰 크기의 μ •μˆ˜
  • float (4λ°”μ΄νŠΈ): λΆ€λ™μ†Œμˆ˜μ μ„ κ°–λŠ” μ‹€μˆ˜ (예) 3.14, 0.0, -28.56
  • double (8λ°”μ΄νŠΈ) : λΆ€λ™μ†Œμˆ˜μ μ„ ν¬ν•¨ν•œ 더 큰 μ‹€μˆ˜

 

ν˜•μ‹ μ§€μ •μž

  • %c : char
  • %f : float, double
  • %i : int
  • %li : long
  • %s : string

 

 

μ „μ²˜λ¦¬(Precompile)

컴파일의 전체 과정은 λ„€ λ‹¨κ³„λ‘œ λ‚˜λˆ„μ–΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑 첫 번째 λ‹¨κ³„λŠ” μ „μ²˜λ¦¬μΈλ°, μ „μ²˜λ¦¬κΈ°μ— μ˜ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. # 으둜 μ‹œμž‘λ˜λŠ” C μ†ŒμŠ€ μ½”λ“œλŠ” μ „μ²˜λ¦¬κΈ°μ—κ²Œ μ‹€μ§ˆμ μΈ 컴파일이 이루어지기 전에 무언가λ₯Ό μ‹€ν–‰ν•˜λΌκ³  μ•Œλ €μ€λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, #includeλŠ” μ „μ²˜λ¦¬κΈ°μ—κ²Œ λ‹€λ₯Έ 파일의 λ‚΄μš©μ„ ν¬ν•¨μ‹œν‚€λΌκ³  μ•Œλ €μ€λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ˜ μ†ŒμŠ€ μ½”λ“œμ— #include μ™€ 같은 쀄을 ν¬ν•¨ν•˜λ©΄, μ „μ²˜λ¦¬κΈ°λŠ” μƒˆλ‘œμš΄ νŒŒμΌμ„ μƒμ„±ν•˜λŠ”λ° 이 νŒŒμΌμ€ μ—¬μ „νžˆ C μ†ŒμŠ€ μ½”λ“œ ν˜•νƒœμ΄λ©° stdio.h 파일의 λ‚΄μš©μ΄ #include 뢀뢄에 ν¬ν•¨λ©λ‹ˆλ‹€.

 

컴파일(Compile)

μ „μ²˜λ¦¬κΈ°κ°€ μ „μ²˜λ¦¬ν•œ μ†ŒμŠ€ μ½”λ“œλ₯Ό μƒμ„±ν•˜κ³  λ‚˜λ©΄ κ·Έ λ‹€μŒ λ‹¨κ³„λŠ” μ»΄νŒŒμΌμž…λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬λΌκ³  λΆˆλ¦¬λŠ” ν”„λ‘œκ·Έλž¨μ€ C μ½”λ“œλ₯Ό μ–΄μ…ˆλΈ”λ¦¬μ–΄λΌλŠ” μ €μˆ˜μ€€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μ»΄νŒŒμΌν•©λ‹ˆλ‹€.

μ–΄μ…ˆλΈ”λ¦¬λŠ” C보닀 μ—°μ‚°μ˜ μ’…λ₯˜κ°€ 훨씬 μ μ§€λ§Œ, μ—¬λŸ¬ 연산듀이 ν•¨κ»˜ μ‚¬μš©λ˜λ©΄ Cμ—μ„œ ν•  수 μžˆλŠ” λͺ¨λ“  것듀을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. C μ½”λ“œλ₯Ό μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ λ³€ν™˜μ‹œμΌœμ€ŒμœΌλ‘œμ¨ μ»΄νŒŒμΌλŸ¬λŠ” 컴퓨터가 이해할 수 μžˆλŠ” 언어와 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€. μ»΄νŒŒμΌμ΄λΌλŠ” μš©μ–΄λŠ” μ†ŒμŠ€ μ½”λ“œμ—μ„œ 였브젝트 μ½”λ“œλ‘œ λ³€ν™˜ν•˜λŠ” 전체 과정을 톡틀어 일컫기도 ν•˜μ§€λ§Œ, ꡬ체적으둜 μ „μ²˜λ¦¬ν•œ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ λ³€ν™˜μ‹œν‚€λŠ” 단계λ₯Ό λ§ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

 

μ–΄μ…ˆλΈ”(Assemble)

μ†ŒμŠ€ μ½”λ“œκ°€ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ λ³€ν™˜λ˜λ©΄, λ‹€μŒ 단계인 μ–΄μ…ˆλΈ” λ‹¨κ³„λ‘œ μ–΄μ…ˆλΈ”리 μ½”λ“œλ₯Ό 였브젝트 μ½”λ“œλ‘œ λ³€ν™˜μ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ»΄ν“¨ν„°μ˜ μ€‘μ•™μ²˜λ¦¬μž₯μΉ˜κ°€ ν”„λ‘œκ·Έλž¨μ„ μ–΄λ–»κ²Œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œ 수 μžˆλŠ” λͺ…λ Ήμ–΄ ν˜•νƒœμΈ μ—°μ†λœ 0κ³Ό 1λ“€λ‘œ λ°”κΏ”μ£ΌλŠ” μž‘μ—…μ΄μ£ . 이 λ³€ν™˜μž‘μ—…μ€ μ–΄μ…ˆλΈ”λŸ¬λΌλŠ” ν”„λ‘œκ·Έλž¨μ΄ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ†ŒμŠ€ μ½”λ“œμ—μ„œ 였브젝트 μ½”λ“œλ‘œ 컴파일 λ˜μ–΄μ•Ό ν•  파일이 λ”± ν•œ 개라면, 컴파일 μž‘μ—…μ€ μ—¬κΈ°μ„œ 끝이 λ‚©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°μ—λŠ” 링크라 λΆˆλ¦¬λŠ” 단계가 μΆ”κ°€λ©λ‹ˆλ‹€.

 

링크(Link)

λ§Œμ•½ ν”„λ‘œκ·Έλž¨μ΄ (math.hλ‚˜ cs50.h와 같은 라이브러리λ₯Ό 포함해) μ—¬λŸ¬ 개의 파일둜 이루어져 μžˆμ–΄ ν•˜λ‚˜μ˜ 였브젝트 파일둜 합쳐져야 ν•œλ‹€λ©΄ λ§ν¬λΌλŠ” 컴파일의 λ§ˆμ§€λ§‰ 단계가 ν•„μš”ν•©λ‹ˆλ‹€. λ§μ»€λŠ” μ—¬λŸ¬ 개의 λ‹€λ₯Έ 였브젝트 μ½”λ“œ νŒŒμΌμ„ μ‹€ν–‰ κ°€λŠ₯ν•œ ν•˜λ‚˜μ˜ 였브젝트 μ½”λ“œ 파일둜 ν•©μ³μ€λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ»΄νŒŒμΌμ„ ν•˜λŠ” λ™μ•ˆμ— CS50 라이브러리λ₯Ό λ§ν¬ν•˜λ©΄ 였브젝트 μ½”λ“œλŠ” GetInt()λ‚˜ GetString() 같은 ν•¨μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ‹€ν–‰ν•  μ§€ μ•Œ 수 있게 λ©λ‹ˆλ‹€.

버그와 디버깅

버그(bug)λŠ” μ½”λ“œμ— λ“€μ–΄μžˆλŠ” 였λ₯˜μž…λ‹ˆλ‹€. λ²„κ·Έλ‘œ 인해 ν”„λ‘œκ·Έλž¨μ˜ 싀행에 μ‹€νŒ¨ν•˜κ±°λ‚˜ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ›ν•˜λŠ” λŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€. 버그λ₯Ό λ§Œλ“€κ³  μ‹Άμ§€ μ•Šκ² μ§€λ§Œ λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ 버그와 λ§ˆμ£Όν•˜κ²Œ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. λ””버깅(debugging)은 μ½”λ“œμ— μžˆλŠ” 버그λ₯Ό μ‹λ³„ν•˜κ³  κ³ μΉ˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” λ””버거라고 λΆˆλ¦¬λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜μ—¬ 디버깅을 ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

μœ„μ™€ 같은 그림을 κ³΅μ‹μœΌλ‘œ ν‘œκΈ°ν•œ 것이 Big O ν‘œκΈ°λ²•μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ OλŠ” “on the order of”의 μ•½μžλ‘œ, μ‰½κ²Œ μƒκ°ν•˜λ©΄ “~만큼의 μ •λ„λ‘œ μ»€μ§€λŠ”” κ²ƒμ΄λΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

O(n) 은 n만큼 μ»€μ§€λŠ” κ²ƒμ΄λ―€λ‘œ n이 λŠ˜μ–΄λ‚ μˆ˜λ‘ μ„ ν˜•μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€. O(n/2)도 κ²°κ΅­ n이 맀우 컀지면 1/2은 큰 μ˜λ―Έκ°€ μ—†μ–΄μ§€λ―€λ‘œ O(n)이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

주둜 μ•„λž˜ λͺ©λ‘κ³Ό 같은 Big O ν‘œκΈ°κ°€ μ‹€ν–‰ μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

  • O(n^2)
  • O(n log n)
  • O(n) - μ„ ν˜• 검색
  • O(log n) - 이진 검색
  • O(1)

 

Big Oκ°€ μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ μ‹œκ°„μ˜ μƒν•œμ„ λ‚˜νƒ€λ‚Έ 것이라면, λ°˜λŒ€λ‘œ Big ΩλŠ” μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ μ‹œκ°„μ˜ ν•˜ν•œμ„ λ‚˜νƒ€λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ„ ν˜• κ²€μƒ‰μ—μ„œλŠ” n개의 ν•­λͺ©μ΄ μžˆμ„λ•Œ μ΅œλŒ€ n번의 검색을 ν•΄μ•Ό ν•˜λ―€λ‘œ μƒν•œμ΄ O(n)이 λ˜μ§€λ§Œ 운이 μ’‹λ‹€λ©΄ ν•œ λ²ˆλ§Œμ— 검색을 λλ‚Όμˆ˜λ„ μžˆμœΌλ―€λ‘œ ν•˜ν•œμ€ Ω(1)이 λ©λ‹ˆλ‹€.

μ—­μ‹œ μ•„λž˜ λͺ©λ‘κ³Ό 같은 Big Ω ν‘œκΈ°κ°€ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

  • Ω(n^2)
  • Ω(n log n)
  • Ω(n) - λ°°μ—΄ μ•ˆμ— μ‘΄μž¬ν•˜λŠ” κ°’μ˜ 개수 μ„ΈκΈ°
  • Ω(log n)
  • Ω(1) - μ„ ν˜• 검색, 이진 검색

 

 

 

μ„ ν˜• 검색 O(n) / Ω(1)

 

버블 μ •λ ¬ O(n^2) / Ω(n^2), Ω(n)

μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λŠ” λ²„λΈ” μ •λ ¬μž…λ‹ˆλ‹€.

버블 정렬은 λ‘ 개의 μΈμ ‘ν•œ 자료 값을 λΉ„κ΅ν•˜λ©΄μ„œ μœ„μΉ˜λ₯Ό κ΅ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ •λ ¬ν•˜λŠ” 방법을 λ§ν•©λ‹ˆλ‹€.

λ§Œμ•½ 정렬이 λͺ¨λ‘ λ˜μ–΄ μžˆλŠ” 숫자 λ¦¬μŠ€νŠΈκ°€ μ£Όμ–΄μ§„λ‹€λ©΄ κ΅ν™˜μ΄ ν•˜λ‚˜λ„ μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 

κ·Έλ ‡κ²Œ 되면 버블 μ •λ ¬μ˜ ν•˜ν•œμ€  Ω(n)이 λ©λ‹ˆλ‹€.

 

선택 μ •λ ¬ O(n^2) / Ω(n^2)

정렬을 μœ„ν•œ μ•Œκ³ λ¦¬μ¦˜ 쀑 μ„ νƒμ •렬을 λ°°μ—΄ μ•ˆμ˜ 자료 쀑 κ°€μž₯ μž‘μ€ 수(ν˜Ήμ€ κ°€μž₯ 큰 수)λ₯Ό μ°Ύμ•„ 첫 번째 μœ„μΉ˜(ν˜Ήμ€ κ°€μž₯ λ§ˆμ§€λ§‰ μœ„μΉ˜)의 μˆ˜μ™€ κ΅ν™˜ν•΄μ£ΌλŠ” λ°©μ‹μ˜ μ •λ ¬μž…λ‹ˆλ‹€.

선택 μ •렬은 κ΅ν™˜ 횟수λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 반면 각 자료λ₯Ό λΉ„κ΅ν•˜λŠ” νšŸμˆ˜λŠ” μ¦κ°€ν•©λ‹ˆλ‹€.

 

병합 μ •λ ¬ O(n log n) / Ω(n log n)

μ „ν™”λ²ˆν˜ΈλΆ€μ˜ λΆ„ν•  정볡 νƒμƒ‰μ²˜λŸΌ 데이터λ₯Ό 반으둜 λ‚˜λˆ„μ–΄κ°„λ‹€λŠ” 것과 곡톡점이 μžˆλŠ” 방법인 λ³‘ν•© μ •λ ¬(합병 μ •λ ¬)이 μžˆμŠ΅λ‹ˆλ‹€.

병합 정렬은 μ›μ†Œκ°€ ν•œ κ°œκ°€ 될 λ•ŒκΉŒμ§€ κ³„μ†ν•΄μ„œ 반으둜 λ‚˜λˆ„λ‹€κ°€ λ‹€μ‹œ ν•©μ³λ‚˜κ°€λ©° 정렬을 ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

       7 | 4 | 5 | 2 | 6 | 3 | 8 | 1 → κ°€μž₯ μž‘μ€ λΆ€λΆ„ (숫자 1개)으둜 λ‚˜λˆ μ§„ κ²°κ³Όμž…λ‹ˆλ‹€.

4   7 | 2   5 | 3   6 | 1   8 → 숫자 1κ°œμ”©μ„ μ •λ ¬ν•˜μ—¬ λ³‘ν•©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

2   4   5   7 | 1   3   6   8 → 숫자 2κ°œμ”©μ„ μ •λ ¬ν•˜μ—¬ λ³‘ν•©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

1   2   3   4   5   6   7   8 → λ§ˆμ§€λ§‰μœΌλ‘œ 숫자 4κ°œμ”©μ„ μ •λ ¬ν•˜μ—¬ λ³‘ν•©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.