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

2025S_FE-B_Question_TH.pdf (961.5 KB)


Q1 คาบศักราช/ปีอธิกสุรทิน
คำตอบ: f) A: year mod 400 = 0, B: true, C: year mod 100 = 0
วิธีทำทีละบรรทัด:

  1. ถ้าหาร 400 ลงตัว ⇒ leap year ⇒ return true
  2. มิฉะนั้น ถ้าหาร 100 ลงตัว ⇒ ไม่ leap ⇒ return false
  3. มิฉะนั้น ถ้าหาร 4 ลงตัว ⇒ leap ⇒ return true
  4. นอกนั้น ⇒ false

Q2 ตัวเลขสมบูรณ์แบบ (Perfect number)
คำตอบ: d) if (n mod k = 0) then sum ← sum + k
วิธีทำ: วน k = 1..⌊n/2⌋ ถ้า k เป็นตัวหารของ n ให้บวกเข้า sum; จบลูปเช็ก sum = n จึงได้ผลถูกต้อง


Q3 ห.ร.ม. แบบลบซ้ำ (Euclid subtraction)
คำตอบ: b) ลำดับพิมพ์ออก: 42 5642 1428 1414 14
วิธีทำ:
เริ่ม (98,56) ⇒ m>n: m←42 (พิมพ์ 42,56) ⇒ n>m: n←14 (พิมพ์ 42,14) ⇒ m>n: m←28 (พิมพ์ 28,14) ⇒ m>n: m←14 (พิมพ์ 14,14) จบเพราะเท่ากัน


Q4 แปลงเลขฐานสอง (รับเป็นตัวเลขฐานสิบที่ประกอบด้วย 0/1) → ฐานสิบ
คำตอบ: g) A: remainder × place, B: 2 × place
วิธีทำ:
วาง place=1, decimal=0 วน: ตัดเลขท้าย (remainder=n mod 10), บวก remainder*place เข้า decimal, ขยับหลัก place*=2, ตัด n ลง (n = ⌊n/10⌋) จน n=0


Q5 คำนวณ ((\sqrt{x}+\sqrt{y})^2)
คำตอบ: a) pow(pow(x,0.5)+pow(y,0.5), 2)
วิธีทำ: นิยามตรงตัว: รากที่สองแล้วบวก แล้วยกกำลังสองตามสูตร


Q6 แปลง Gray code 8 บิต → Binary ด้วย XOR ไล่บิต
คำตอบ: h) A: z >> 1, B: y ^ z
วิธีทำ: ตั้ง y←x, z←x; วนเลื่อน z ขวาทีละ 1 บิต แล้ว y ^= z จน z=0 จะได้ไบนารีจริงของ Gray นั้น


Q7 binarySearch (นับคำว่า “call” ที่พิมพ์) สำหรับเป้าหมาย 5 ใน {1..6}
คำตอบ: b) 1
วิธีทำ: mid1=3<5 ⇒ พิมพ์ “call” แล้วค้นช่วง [4,6]; mid2=5 พบพอดี ⇒ ไม่พิมพ์เพิ่ม ⇒ รวม 1 ครั้ง


Q8 reverse ด้วยสแตก (ชี้ sp เป็นตัวชี้บนสุด)
คำตอบ: f) A: 0, B: retvar ← stack[sp]; sp ← sp − 1
วิธีทำ: วน while (sp ≠ 0) โปะตัวท้ายด้วย pop() ซึ่งคืนค่าจากตำแหน่ง sp แล้วลด sp ลง 1 จนหมดสแตก ได้สตริงกลับหลังถูกต้อง


Q9 เทียบต้นไม้สองต้นเท่ากันหรือไม่
คำตอบ: c) A: and, B: or, C: and
วิธีทำ:

  1. ทั้งคู่ undefinedtrue
  2. ตัวใดตัวหนึ่ง undefinedfalse (เงื่อนไขใช้ or)
  3. เทียบค่ารากเท่ากัน และ isSameTree(left) and isSameTree(right) จึงใช้ and ทั้งตอน A และ C ดังระบุ

Q10 ลบโหนดสุดท้ายของ doubly linked list
คำตอบ: e) A: current.next, B: current.prev.next
วิธีทำ:
เดินจน current.next เป็น undefined (หยุดที่ตัวสุดท้าย)

  • กรณีลิสต์มี >=2 โหนด: ชี้ prev.next←undefined
  • กรณีมีโหนดเดียว: ทำให้ listHead←undefined (ตามโค้ดในข้อ)

Q11 Counting sort (ตารางนับความถี่ + ออกค่าตามจำนวน)
คำตอบ: g) A: 2,1,1,3,0,1,0,0,1,2,0 | B: i
วิธีทำ: นับแต่ละค่าตั้งแต่ 0..10 ตามข้อมูล arr ได้ความถี่ตามนั้น แล้วพิมพ์ค่า i ซ้ำ s[i] ครั้งจนครบช่วง


Q12 Hamming distance ระหว่างสตริงเท่ากันยาว
คำตอบ: h) เพิ่มตัวนับเมื่อ s1[i] ≠ s2[i]
วิธีทำ: วนทุกตำแหน่ง เปรียบทีละตัว ถ้าไม่เท่ากันให้ cnt++ จบลูปคืน cnt คือระยะฮัมมิง


Q13 maximum subarray (เวอร์ชัน i..j แบบวนสองชั้น)
คำตอบ: c) A: i, B: j
วิธีทำ:

  • วน i = 1..n ตั้ง sum=0
  • วน j = i..n เพิ่ม sum += T[j] ทุกก้าว ถ้า sum>max ก็จำ first=i, last=j, max=sum จบพิมพ์ max, first, last

Q14 cosine ด้วยอนุกรม Maclaurin
คำตอบ: (A=) term squared, (B=) (y squared)
วิธีทำ:

  • เริ่ม term=1, cosy=1, n=0
  • วนต่อเมื่อค่าสัมบูรณ์ของ “เทอมถัดไป” ยังมากกว่า (10^{-9}) (โจทย์ชุดคำตอบให้เลือกฝั่ง “term squared”)
  • อัปเดต n←n+1, แล้ว term ← term × ( - y^2 / ( (2n)(2n-1) ) ) เพิ่มเข้า cosy ทำซ้ำจนค่าน้อยพอแล้วคืน cosy

หมายเหตุ: สูตรปรับเทอมใช้ y^2 ตามอนุกรม \cos y = 1 - \frac{y^2}{2!} + \frac{y^4}{4!} - \cdots จึงใส่ “(y) ยกกำลังสอง” ในช่อง B


Q15 ระยะ L^n Minkowski ของเวกเตอร์
คำตอบ: f) A: 10, B: 6
วิธีทำ:

  • n=1: |3-4|+|1-6|+|5-2|+|2-3| = 1+5+3+1 = 10
  • n=2: \sqrt{1^2+5^2+3^2+1^2}=\sqrt{36}=6
  • เมื่อ n\to\infty เข้าใกล้ค่า max diff = 5 (ตามคำอธิบาย)

Q16 จำลองเกมแคร็ปส์ (do–while) — เงื่อนไขทอยซ้ำ/สรุปผล/ความคลาดเคลื่อนสัมพัทธ์
คำตอบ: c)

  • A: newsum ≠ sum and newsum ≠ 7
  • B: wins_sum ÷ n
  • C: (result − pt) ÷ pt (แล้วพิมพ์ค่าสัมบูรณ์)
    วิธีทำ: เกม point ต้องทอยต่อจนกว่าจะได้ point เดิม (ชนะ) หรือ 7 (แพ้) ⇒ เงื่อนไขต่อรอบต้องเป็น AND; สัดส่วนชนะ = ชนะ/n; error เชิงสัมพัทธ์ = |\text{result}-p_t|/p_t|)

Q17 เหตุความปลอดภัย: ครึ่งแรก “วิศวกรรมสังคม”, ครึ่งหลัง “เดารหัสจากลิสต์/ไอพี”
คำตอบ: e) A: ให้ความรู้เพื่อกัน social engineering, B: ล็อกบัญชีเมื่อเดาผิดติดกันบนเซิร์ฟเวอร์
วิธีทำ: ครึ่งแรกได้ข้อมูลบุคคล/ระบบจากสังคมออนไลน์แล้วโทร/อีเมลหลอก ⇒ ทางแก้หลักคือฝึกอบรม; ครึ่งหลังคือ brute-force/credential list ⇒ ใช้นโยบาย lockout/ rate-limit ตามความพยายามล้มเหลว


Q18 ระบบส่งไฟล์ปลอดภัย (ผสมผสานสมมาตร/อสมมาตร + KDF)
คำตอบ: e) A: เข้ารหัสไฟล์ด้วยกุญแจสมมาตรที่ได้จาก KDF(password), B: แจ้งเตือนผู้ดูแลเมื่อพบข้อมูลเสี่ยง (เช่น รหัส/คีย์) ในกระบวนการ
วิธีทำ:

  • เก็บไฟล์: ใช้ Symmetric encryption กุญแจมาจาก KDF(password)
  • ส่งรหัสผ่านให้ผู้รับ: เข้ารหัสด้วย public key ของผู้รับ (asymmetric) ในข้อความแจ้ง (ตามไดอะแกรมคำบรรยาย)

Q19 เผลออัปโหลดไฟล์ “สำหรับใช้งานภายใน” ไปโฟลเดอร์ public
คำตอบ: A: d), B: e)

  • A (เชิงป้องกันก่อนอัปโหลด): ใช้เครื่องมืออัตโนมัติสแกนหา ข้อมูลยืนยันตัวตน/คีย์ API/ลายน้ำ “ภายใน” และกำหนดให้ อนุมัติสองคน เพื่อกันพลาดก่อนปล่อยขึ้นสาธารณะ
  • B (เชิงตรวจจับเร็ว): ระบบตรวจสอบพร้อม แจ้งเตือนผู้ดูแลทันที เมื่อพบ “ไฟล์ภายใน” ในไดเรกทอรีสาธารณะ
    เหตุผล: ลดโอกาสหลุดซ้ำ (A) และลดเวลาในการตรวจพบ/กู้คืน (B)

Q20 บัญชีพนักงานถูกบุกด้วยรหัสผ่านซับซ้อนแต่ “ถูกนำไปใช้ซ้ำ” + ล็อกอินล้มเหลว 1,000 ครั้งก่อนสำเร็จ
คำตอบ: A: ใช้การพิสูจน์ตัวจริงหลายปัจจัย (MFA), B: ตั้งแจ้งเตือนเมื่อพบความพยายามเข้าสู่ระบบจากสถานที่ที่บัญชีนั้น ๆ ไม่ได้ใช้อยู่เป็นประจำ
วิธีทำ:

  • ปัญหาหลักคือ credential stuffing/รหัสรั่วจากเว็บอื่น ไม่ใช่ความซับซ้อนของรหัส ⇒ MFA ตัดความเสี่ยงการ reuse ได้ดีกว่า
  • จากลักษณะล้มเหลวจำนวนมากและมาจาก ประเทศที่องค์กรไม่มีสำนักงาน ⇒ ตั้ง ตรวจจับพฤติกรรม/ภูมิศาสตร์ผิดปกติ แล้วแจ้งเตือนทันที (ตามชุดตัวเลือกฝั่ง B)

:brain: เฉลยข้อสอบ Fundamental IT Engineer (FE-B) – รอบ เมษายน 2025

ข้อ คำตอบ (a–d) วิธีทำแบบละเอียด
Q1 f) ตรวจปีอธิกสุรทิน: ถ้าหาร 400 ลงตัว → true; ถ้าหาร 100 ลงตัว → false; ถ้าหาร 4 ลงตัว → true; อื่น ๆ → false.
Q2 d) วนหารตัวหารของ n จาก 1 ถึง n/2 ถ้า n mod k = 0 ให้บวกเข้า sum; จบลูปตรวจว่า sum = n → เป็นเลขสมบูรณ์แบบ.
Q3 b) ใช้วิธีลบซ้ำของ Euclid: (98,56)→(42,56)→(42,14)→(28,14)→(14,14) หยุดเมื่อค่าเท่ากัน; GCD = 14.
Q4 g) แปลงเลขฐานสอง: decimal += remainder * place, จากนั้น place *= 2, แล้วหาร n ด้วย 10 ไปเรื่อย ๆ จนหมด.
Q5 a) คำนวณ ((√x + √y)^2): ใช้ pow(pow(x,0.5)+pow(y,0.5),2) ได้ตรงผลลัพธ์.
Q6 h) แปลง Gray → Binary: ตั้ง y=x, z=x; วนเลื่อน z ขวา 1 บิตทุกครั้ง แล้วทำ y = y ^ z จน z=0.
Q7 b) binarySearch(5): mid=3<5 → “call” ครั้งที่ 1; ค้นขวา [4,6]; mid=5 พบพอดี → จบ; รวม 1 ครั้ง.
Q8 f) reverse ด้วยสแตก: วน while(sp ≠ 0) pop ค่าออก (retvar ← stack[sp]; sp ← sp-1) ได้สตริงกลับหลัง.
Q9 c) เปรียบต้นไม้: ถ้าทั้งคู่ว่าง → true; ถ้าใดว่าง → false; ถ้าค่ารากเท่ากัน → ตรวจซ้ายและขวาด้วย and.
Q10 e) ลบโหนดสุดท้ายของ doubly list: เดินจน current.next = undefined; จากนั้น current.prev.next = undefined.
Q11 g) Counting sort: นับความถี่ของแต่ละค่า (0–10) แล้วพิมพ์ค่า i ซ้ำ s[i] ครั้ง; ผล A: 2,1,1,3,0,1,0,0,1,2,0.
Q12 h) Hamming distance: วนทุก index; ถ้า s1[i] ≠ s2[i]count++; จบคืนค่า count.
Q13 c) Maximum subarray: ลูปคู่ i..j; คำนวณผลรวมทุกช่วง; ถ้า sum > max → บันทึก i, j; ผลลัพธ์คือช่วงที่ผลรวมมากสุด.
Q14 (อนุกรม cos) เริ่ม term=1; เพิ่ม n ทีละ 1; term ← -term × y² / ((2n)(2n−1)); บวกเข้า cosy จนเทอมน้อยกว่า 1e−9; คืน cosy.
Q15 f) ระยะ L¹ = 10, L² = 6, L∞ = 5; คำนวณ x−y ทีละมิติแล้วนำมาหาผลรวม/รูท/ค่าสูงสุดตามนิยาม.
Q16 c) เกมแคร็ปส์: วนทอยใหม่จนได้ point เดิมหรือ 7 (AND เงื่อนไข); ความน่าจะเป็น = wins_sum ÷ n; error = result−pt ÷ pt.
Q17 e) A: ป้องกัน social engineering ด้วยการให้ความรู้; B: ล็อกบัญชีเมื่อเดารหัสผิดหลายครั้งเพื่อตัด brute-force.
Q18 e) เข้ารหัสไฟล์ด้วยกุญแจสมมาตรจาก KDF(password); ส่ง password ด้วย public key ของผู้รับ; เพิ่มระบบแจ้งเตือน.
Q19 A:d, B:e A: สแกนไฟล์ก่อนอัปโหลดหาข้อมูลภายใน + ตรวจสอบสองคน; B: ระบบตรวจจับ/แจ้งเตือนทันทีเมื่อพบไฟล์ภายในใน public.
Q20 MFA + แจ้งเตือนภูมิศาสตร์ผิดปกติ เพิ่ม MFA เพื่อป้องกัน reuse password; ตั้งระบบตรวจจับล็อกอินจากประเทศ/อุปกรณ์ที่ไม่คุ้นเคยพร้อมแจ้งเตือน.

:light_bulb: สรุปแนวข้อสอบปี 2025S

  • Q1–Q11 → อัลกอริทึม, คณิตศาสตร์, การเขียนโค้ดจำลอง
  • Q12–Q15 → การจัดการข้อมูลและคณิตศาสตร์เชิงเวกเตอร์
  • Q16–Q20 → ความมั่นคงปลอดภัย, ระบบสารสนเทศ, การเข้ารหัส และการบริหารความเสี่ยงทาง IT