2025S_FE-B_Question_TH.pdf (961.5 KB)
Q1 คาบศักราช/ปีอธิกสุรทิน
คำตอบ: f) A: year mod 400 = 0, B: true, C: year mod 100 = 0
วิธีทำทีละบรรทัด:
- ถ้าหาร 400 ลงตัว ⇒ leap year ⇒
return true - มิฉะนั้น ถ้าหาร 100 ลงตัว ⇒ ไม่ leap ⇒
return false - มิฉะนั้น ถ้าหาร 4 ลงตัว ⇒ leap ⇒
return true - นอกนั้น ⇒
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 56 → 42 14 → 28 14 → 14 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
วิธีทำ:
- ทั้งคู่
undefined⇒true - ตัวใดตัวหนึ่ง
undefined⇒false(เงื่อนไขใช้or) - เทียบค่ารากเท่ากัน และ
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)