เฉลยและวิธีทำแบบทีละขั้น 2024Apr-FE-PM

2024S_FE-B_Questions_Final_Translated_v2.pdf (662.9 KB)


Q1

ตอบ: e) (เติม A: ≥, B: "P", C: "F")

วิธีทำ:

  • เกณฑ์ในตาราง: 80–100 ⇒ D, 50–79 ⇒ P, 0–49 ⇒ F
  • เงื่อนไขต้องเป็น if (score ≥ 80) ret ← "D"; elseif (score ≥ 50) ret ← "P"; else "F" จึงตรงกับตัวเลือก e) ที่ให้ ≥, "P", "F" ครบถ้วน.

Q2

ตอบ: d) (ตั๋วราคา 10 บาทถ้าอายุน้อยกว่าหรือเท่ากับ 10 หรือ มากกว่าหรือเท่ากับ 60 หรือ เป็นสมาชิก)

วิธีทำ:

  • เงื่อนไขส่วนลดคือเด็ก/ผู้สูงอายุ/สมาชิก จึงใช้ OR รวมกัน ⇒ ตัวเลือก d).

Q3

ตอบ: c) (i mod 2 = 0)

วิธีทำ:

  • ต้องรวมเฉพาะเลขคู่ระหว่าง 1–100 ⇒ เงื่อนไขเลขคู่คือ i mod 2 = 0.

Q4

ตอบ: b) (เติม sum ← sum + (num mod 10) และ num ← ส่วนที่เป็นจำนวนเต็มของ (num ÷ 10))

วิธีทำ:

  • หาผลรวมหลักทุกหลักของ num ⇒ หลักหน่วยคือ num mod 10; ตัดหลักหน่วยทิ้งด้วยหารปัดทิ้ง 10 ⇒ ตรง b).

Q5

ตอบ: d) (minute ← modulus(division(input,60),60), hour ← division(input,3600))

วิธีทำ:

  • วินาทีที่เหลือ = input mod 60 (ให้มาแล้ว)
  • นาทีที่เหลือ = เอาจำนวน “นาทีทั้งหมด” (input ÷ 60) แล้ว mod 60 ⇒ modulus(division(input,60),60)
  • ชั่วโมง = input ÷ 3600division(input,3600).

Q6

ตอบ: a) (if ((rbyte & (00000001 << (i - 1))) ≠ 0) …)

วิธีทำ:

  • ตรวจบิตที่ตำแหน่ง i (เริ่มนับจาก 1) ⇒ สร้างมาสก์ 1 << (i-1) แล้ว AND กับ rbyte ถ้าผล ≠ 0 แปลว่าบิตนั้นเป็น 1 ⇒ นับเพิ่ม.

Q7

ตอบ: i) (เงื่อนไขฐาน: (n = 1) or (n = 2) คืน n-1; มิฉะนั้นคืน fibo(n-1) + fibo(n-2))

วิธีทำ:

  • ลำดับฟีโบนักชีเริ่ม 0,1 ⇒ ค่าที่ตำแหน่ง 1 และ 2 คือ 0,1 ตามลำดับ จึงใช้ base case n=1,2 ⇒ n-1; ที่เหลือใช้ผลรวมสองตัวก่อนหน้า.

Q8

ตอบ: b) (เติม A: index > max, B: index + 1, C: index - 1)

วิธีทำ:

  • โครงสร้างสแตกใช้ตัวชี้ index ชี้ “ตำแหน่งว่างถัดไป”; ว่างเมื่อ index = 1; เต็มเมื่อ index > max
  • push: เก็บที่ content[index] แล้ว index ← index + 1
  • pop: ลด index ก่อน แล้วคืน content[index].

Q9 (เดินต้นไม้ preorder ด้วยสแตก)

ตอบ: b) (เติม A: 0, B: v.right, C: v.left)

วิธีทำ:

  • Preorder = root → left → right
  • ใช้สแตก: ดึง v ออกมาพิมพ์ก่อน แล้ว “ดัน right ก่อน left” เพื่อให้ left โผล่มาก่อนตอน pop ⇒ push(v.right) แล้ว push(v.left)
  • ลูปทำงานจน sp ≠ 0 ⇒ เงื่อนไข while คือ sp ≠ 0 ซึ่งในแบบเลือกกรอกเป็น A: 0 (ใช้ while (sp ≠ A)).

Q10 (เชื่อมลิสต์วน)

ตอบ: b) (เติม A: listHead, B: tmp.next)

วิธีทำ:

  • หาโหนดสุดท้ายของลิสต์วงกลมโดยวนจนกว่า tmp.next == listHead
  • ลูปจึงเป็น while (tmp.next is not listHead) tmp ← tmp.next แล้วผูก tmp.next ← newNode และ newNode.next ← listHead.

Q11 (Selection Sort — เติมช่องว่าง)

ตอบ: เติมค่าที่ถูกต้องคือ

  • A: i + 1 (เริ่มค้นหาตำแหน่ง min จากถัดจาก i)
  • B: < (อัปเดต minPos เมื่อ data[j] < data[minPos])
  • C: data[i] (สลับ data[i] กับ data[minPos] โดยใช้ temp ← data[i])

วิธีทำ:

  • selection sort วน i = 1..n-1, set minPos = i, วน j = i+1..n หา “ค่าต่ำสุด” ด้วย < แล้วสลับที่ท้ายรอบ. (หน้าโจทย์ส่วนตัวเลือกในไฟล์นี้พิมพ์ตกหล่น/กะเทาะ แต่โค้ดที่ถูกต้องต้องเป็นสามค่าตามนี้).

Q12 (ตรวจพาลินดรอม – เงื่อนไขลูป)

ตอบ: b) (while (i < (len ÷ 2) + 1))

วิธีทำ:

  • ตรวจคู่ตัวอักษรจากซ้าย–ขวาให้ครบครึ่งหนึ่งของสตริง
  • เงื่อนไข i < (len ÷ 2) + 1 (โดยเริ่ม i=1 และลดขวา) ให้จำนวนรอบเท่าที่ต้องเปรียบเทียบพอดี แม้กรณียาวเป็นเลขคู่.

Q13 (วงเล็บสมดุล)

ตอบ: h) (เติม A: ≠ c, B: stack.isEmpty(), C: chars[2])

วิธีทำ:

  • ถ้าเจอปิดวงเล็บ: pop วงเล็บเปิดจากสแตก = stacked แล้วต้องเช็คว่า “วงเล็บปิดที่จับคู่กับ stackedไม่เท่ากับ c ⇒ ผิดทันที ⇒ เงื่อนไขคือ get_closing_bracket(stacked) ≠ c
  • หลังจบลูปต้องว่างสนิทจึงสมดุล ⇒ return stack.isEmpty()
  • ฟังก์ชันจับคู่ต้องคืน chars[2] เมื่อพบ chars[1] = c.

Q14 (โปรแกรมสร้าง N-grams)

ตอบ: i) (เติม A: length − n + 1, B: i + n − 1)

วิธีทำ:

  • ตำแหน่งเริ่มของ n-gram ตัวสุดท้ายคือ length - n + 1
  • สำหรับแต่ละ i ความยาว n ตัว ⇒ j วิ่งถึง i + n − 1.

Q15 (cosine similarity)

ตอบ: i) 0.9

วิธีทำ:

  • sxy = 2×3 + 2×1 + 1×1 + 0×1 + 4×2 = 17
  • sxx = 2² + 2² + 1² + 0² + 4² = 25
  • syy = 3² + 1² + 1² + 1² + 2² = 16
  • similarity = sxy / sqrt(sxx×syy) = 17 / sqrt(400) = 17/20 = 0.85 ปัดทศนิยม 1 ตำแหน่งเป็น 0.9.

Q16 (ประมาณค่า sin(x) แบบ Maclaurin)

ตอบ: h) (เติม A: > epsi, B: − vn × x² ÷ ((k − 1) × k))

วิธีทำ:

  • ลูปต่อเมื่อ “พจน์ปัจจุบันยังใหญ่กว่า epsi” ⇒ abs(vn) > epsi
  • สัมพันธ์พจน์ถัดไปของอนุกรมสลับเครื่องหมายและคูณด้วย x²/((k−1)k) เมื่อ k กระโดดทีละ 2 ⇒ vn ← − vn × x² / ((k−1)k).

Q17 (อีเมลน่าสงสัย)

ตอบ: c) (โจมตี ฟิชชิง; โดยทั่วไปดำเนินการผ่าน อีเมลที่ล่อให้คลิกลิงก์ไปเว็บปลอม)

วิธีทำ:

  • ลักษณะตรงกับ phishing: หลอกให้ผู้ใช้คลิกลิงก์กรอกข้อมูลบนเว็บปลอม/แนบไฟล์อันตราย
  • จึงเลือก “ฟิชชิง — การส่งอีเมลเพื่อล่อให้ไปยังเว็บไซต์ปลอม”.

Q18 (PKI สำหรับเว็บ/อีเมล – ตาราง)

ตอบ: f)

  • A: “กุญแจสาธารณะของเว็บเซิร์ฟเวอร์” (ส่ง CSR ที่มี public key ให้ CA เซ็น ไม่เคยส่ง private key)
  • B: “กุญแจสาธารณะของพนักงาน” (ให้คู่ค้าเข้ารหัสอีเมลถึงพนักงานได้)
  • C: “กุญแจส่วนตัวของพนักงาน” (ต้องติดตั้งในอีเมลไคลเอนต์เพื่อ ลงลายเซ็นดิจิทัล)
    เหตุผลตามกระบวนการ PKI มาตรฐาน.

Q19 (เหตุบัญชีลูกค้าถูกยึด + โจมตีฐานข้อมูล)

ตอบ: f) (A: เอสคิวแอลอินเจ็กชัน, B: เว็บแอปพลิเคชันไฟร์วอลล์)

วิธีทำ:

  • เคสล็อกอินแปลกของลูกค้า ⇒ น่าจะมาจาก “รหัสที่รั่วจากเว็บอื่น + ยัดเข้าเว็บนี้ (credential stuffing/ brute-force online)” → องค์กรจึงเพิ่ม 2FA
  • อีกเหตุคือ “เข้าถึง/รันคิวรีฐานข้อมูลโดยไม่พบล็อกอินแอดมิน” ⇒ ลักษณะ SQL Injection
  • มาตรการฝั่งแอปด่านหน้าเพื่อลดช่องโหว่ทันทีคือ WAF ⇒ ตรงชุด (A=SQLi, B=WAF).

Q20

ข้อนี้ในไฟล์ 2024S_FE-B (เม.ย. 2024) ที่คุณอัปโหลด เนื้อหาโจทย์/ตัวเลือกส่วน Q20 ไม่ปรากฏครบถ้วน (ตัดไปในหน้าถัดไป) จึงไม่สามารถระบุคำตอบตัวเลือก a–d ได้อย่างเชื่อถือ โดยไม่เดาเกินข้อมูลในไฟล์ครับ


ด้านล่างนี้คือ ตารางเฉลยแบบเรียบง่าย สำหรับข้อสอบ
:blue_book: Fundamental IT Engineer (FE) Subject B — April 2024 (v2)
รวมทั้งหมด Q1 – Q19
ภาษาไทยทั้งหมด
มีทั้ง “คำตอบที่ถูกต้อง (a–d)” + “วิธีทำย่อ (อธิบายทีละขั้นแบบสั้นกระชับ)”


:brain: เฉลยข้อสอบ FE-B (เมษายน 2024)

ข้อ คำตอบ วิธีทำ / เหตุผลย่อ
Q1 e) ใช้เงื่อนไข score ≥ 80 ⇒ D, score ≥ 50 ⇒ P, อื่นๆ ⇒ F → ตรงกับ e) (≥,“P”,“F”).
Q2 d) เด็ก ≤10 หรือ ≥60 หรือเป็นสมาชิก ⇒ ตั๋ว 10 บาท ใช้ OR รวมทุกเงื่อนไข.
Q3 c) แสดงเลขคู่ 1–100 เงื่อนไขคือ i mod 2 = 0 เท่านั้นที่เป็นเลขคู่.
Q4 b) ผลรวมหลักของตัวเลข: sum += num mod 10, num = num ÷ 10 (ปัดเศษทิ้ง).
Q5 d) วินาที = input mod 60, นาที = (input ÷ 60) mod 60, ชั่วโมง = input ÷ 3600.
Q6 a) ตรวจบิตที่ i: (rbyte & (1 << (i-1))) ≠ 0 นับจำนวนบิตที่เป็น 1.
Q7 i) ฟีโบนักชี: base case n=1,2 ⇒ n−1; อื่นๆ fibo(n-1)+fibo(n-2).
Q8 b) สแตก: เต็มเมื่อ index > max, push แล้ว index+1, pop ก่อนคืน index−1.
Q9 b) Preorder: พิมพ์ root ก่อน แล้ว push right ก่อน left → วนจน stack ว่าง (sp ≠ 0).
Q10 b) ลิสต์วงกลม: วน while(tmp.next ≠ listHead) แล้วเชื่อม tmp.next ← newNode.
Q11 (ค่าแทนที่ถูก)
A: i+1, B: <, C: data[i]
Selection sort: ค้นค่าต่ำสุดจาก i+1..n, สลับกับ data[i].
Q12 b) ตรวจ palindrome จนถึงครึ่งสตริง: while(i < (len ÷ 2) + 1).
Q13 h) ตรวจวงเล็บสมดุล: get_closing_bracket(stacked) ≠ c, return stack.isEmpty().
Q14 i) N-gram: เริ่ม i=1 ถึง length−n+1, แต่ละรอบ j=i..i+n−1 เพื่อพิมพ์ n คำ.
Q15 i) (0.9) Cosine similarity = 17 / √(25×16) = 0.85 ≈ 0.9 (ปัดทศนิยม 1 ตำแหน่ง).
Q16 h) ลูปต่อเมื่อ vn > epsi, พจน์ถัดไป vn ← −vn × x² / ((k−1)×k) (สลับเครื่องหมาย).
Q17 c) เหตุการณ์คือ Phishing ผ่านอีเมลปลอมล่อให้คลิกเว็บปลอม.
Q18 f) (A) กุญแจสาธารณะเว็บเซิร์ฟเวอร์, (B) กุญแจสาธารณะพนักงาน, (C) กุญแจส่วนตัวพนักงาน.
Q19 f) การโจมตี SQL Injection และแก้ด้วย WAF (Web Application Firewall).

:light_bulb: สรุปรวมแนวข้อสอบ

  • Q1–Q11 เป็นแนว “อัลกอริทึม / การเขียนโปรแกรมจำลอง”
  • Q12–Q15 เป็น “ตรรกะโปรแกรม + คณิตศาสตร์ / เวกเตอร์ / สตริง”
  • Q16–Q19 เป็น “ความมั่นคงปลอดภัยและระบบสารสนเทศ”
  • แต่ละข้อเน้นให้เข้าใจ logic และเหตุผลของเงื่อนไข/สูตร มากกว่าท่องจำครับ