Wrong Answer, Runtime Error, Time Limit คืออะไร แก้ตรงไหน
ส่งโค้ดแล้วระบบตอบกลับมาสั้น ๆ ว่า Wrong Answer หรือ Time Limit Exceeded คือจุดที่นักเรียนใหม่เสียเวลามากที่สุด เพราะผลตรวจบอกแค่อาการ ไม่บอกสาเหตุ ผลตรวจแต่ละแบบของ TOI-Zero และ Grader หมายถึงอะไร โค้ดแบบไหนทำให้เกิด และเราสอนให้ไล่แก้ตามลำดับไหน
ประเด็นสำคัญ
- ผลตรวจบอกอาการ ไม่ได้บอกสาเหตุ: Wrong Answer คือคำตอบผิดในบางเคส Runtime Error คือโปรแกรมหยุดกลางทาง Time Limit Exceeded คือทำงานนานเกินกำหนด Compile Error คือยังไม่ได้รันเลย
- ผ่านตัวอย่างในโจทย์แต่ไม่ผ่านชุดทดสอบ ไม่ได้แปลว่าระบบผิด แปลว่ายังมีเคสที่ไม่ได้ลอง เช่น ค่าขอบเขต ข้อมูลซ้ำ และข้อมูลชุดเล็กสุด
- Runtime Error ส่วนใหญ่มาจากเข้าถึงตำแหน่งอาร์เรย์ที่ไม่มี หารด้วยศูนย์ อ่านข้อมูลผิดรูปแบบ หรือใช้ตัวแปรที่ยังไม่กำหนดค่า
- Time Limit แก้ที่วิธีคิดก่อน ไม่ใช่เปลี่ยนภาษา ลูปซ้อนกับข้อมูล 200,000 ค่าทำงาน 20,000 ล้านครั้ง ไม่มีภาษาไหนทัน
- ก่อนส่งใหม่ทุกครั้งต้องเปลี่ยนอะไรสักอย่างด้วยเหตุผล การส่งซ้ำโดยไม่แก้ได้ผลเดิมเสมอ
ในหน้านี้
ผลตรวจแต่ละแบบหมายถึงอะไร
ระบบตรวจอัตโนมัติ ไม่ว่าจะเป็น TOI National Grader ของ TOI-Zero สนามสอบท้ายค่าย หรือ Grader ของเรา ทำงานเหมือนกัน: รันโปรแกรมกับชุดทดสอบหลายชุดที่ผู้ออกโจทย์เตรียมไว้ แล้วเทียบคำตอบทีละชุด ผลตรวจจึงบอกว่าเกิดอะไรขึ้นกับชุดนั้น ไม่ได้บอกว่าโค้ดบรรทัดไหนผิด
| ผลตรวจ | ระบบบอกว่า | มักเกิดจาก |
|---|---|---|
Accepted | ผ่านทุกชุดทดสอบของข้อนั้น | ยังไม่ต้องแก้อะไร แต่ควรดูว่าใช้เวลาเท่าไรเทียบกับขีดจำกัด |
Wrong Answer | โปรแกรมรันจบ แต่คำตอบไม่ตรงในบางชุด | อ่านโจทย์คลาด เงื่อนไขขอบเขตผิด ชนิดข้อมูลล้น หรือรูปแบบผลลัพธ์ไม่ตรง |
Runtime Error | โปรแกรมหยุดทำงานกลางทางในบางชุด | เข้าถึงตำแหน่งอาร์เรย์ที่ไม่มี หารด้วยศูนย์ อ่านข้อมูลผิดรูปแบบ หรือการเรียกซ้ำลึกเกิน |
Time Limit Exceeded | ใช้เวลาเกินที่โจทย์กำหนดในบางชุด | ลูปไม่จบ หรือวิธีคิดทำงานมากเกินไปสำหรับขนาดข้อมูล |
Memory Limit Exceeded | ใช้หน่วยความจำเกินที่กำหนด | ประกาศอาร์เรย์ใหญ่เกินจำเป็น หรือเก็บข้อมูลซ้ำซ้อน |
Compile Error | แปลงโค้ดเป็นโปรแกรมไม่ได้ ยังไม่ได้รัน | ไวยากรณ์ผิด ลืม include หรือเลือกภาษาในระบบไม่ตรงกับโค้ด |
หลายระบบให้คะแนนบางส่วนตามชุดทดสอบที่ผ่าน เช่น ผ่าน 8 จาก 10 ชุดได้ 80 คะแนน ใน TOI-Zero ปี 2569 ข้อที่จะนับต้องได้ตั้งแต่ 80 คะแนน ข้อที่ได้ 79 จึงยังไม่นับ และมักหมายถึงเคสขอบเขตเคสเดียวที่ยังไม่ได้แก้
Wrong Answer: เริ่มจากเคสที่ตัวอย่างยังไม่ครอบคลุม
ตัวอย่างในโจทย์มีไว้ให้เข้าใจรูปแบบข้อมูล ไม่ได้มีไว้พิสูจน์ว่าโค้ดถูก โจทย์นี้เราแต่งเอง: นับจำนวนค่าที่ ไม่น้อยกว่า 50 โค้ดนี้ผ่านตัวอย่างที่ไม่มีค่า 50 แต่ตกทันทีเมื่อชุดทดสอบมี
// นับจำนวนค่าที่ "ไม่น้อยกว่า" 50
int count = 0;
for (int i = 0; i < n; i++) {
if (a[i] > 50) count++; // ผิด: ไม่รวม 50 ต้องเป็น >= 50
}วิธีหาเคสที่พลาด: สร้างข้อมูลเล็กที่สุดที่ยังมีความหมาย แล้วไล่ด้วยมือก่อนรัน
| ประเภทเคส | ตัวอย่าง | จับข้อผิดแบบไหน |
|---|---|---|
ค่าตรงขอบเขตของเงื่อนไข | ค่าเท่ากับ 50 พอดี | มากกว่า กับ ไม่น้อยกว่า |
ข้อมูลชุดเล็กสุด | n = 1 หรือข้อมูลว่าง | ตั้งค่าเริ่มต้นผิด หรือลูปไม่ทำงานเลย |
ข้อมูลซ้ำ | 50 50 50 | นับค่าที่ต่างกันทั้งที่โจทย์ถามจำนวนตำแหน่ง |
ค่าสูงสุดตามโจทย์ | ผลรวมของ 200,000 ค่า ค่าละ 1,000,000,000 | int ล้น ต้องใช้ long long |
รูปแบบผลลัพธ์ | ขึ้นบรรทัดใหม่ท้ายคำตอบ ไม่มีข้อความเกิน | พิมพ์คำว่า คำตอบคือ ทั้งที่โจทย์ให้พิมพ์แค่ตัวเลข |
Runtime Error: หาข้อมูลที่ทำให้โปรแกรมหยุด
โปรแกรมหยุดเพราะทำสิ่งที่ทำไม่ได้ สองสาเหตุที่พบมากที่สุดในค่ายคือเข้าถึงตำแหน่งอาร์เรย์ที่ไม่มี และหารด้วยศูนย์
int a[100];
for (int i = 0; i <= n; i++) { // ผิด: เมื่อ n = 100 จะเขียน a[100] ซึ่งไม่มี
cin >> a[i];
}
cout << total / count; // ผิด: ถ้า count เป็น 0 จะหารด้วยศูนย์- ลูปที่ใช้ น้อยกว่าหรือเท่ากับ n กับอาร์เรย์ขนาด n เขียนเกินขอบเขตหนึ่งช่องเสมอ
- ตัวหารที่มาจากข้อมูล ต้องถามก่อนว่ามีโอกาสเป็นศูนย์ไหม เช่น จำนวนนักเรียนในห้องที่อาจไม่มีใครเลย
- ตัวแปรที่ประกาศแล้วไม่กำหนดค่า มีค่าอะไรก็ได้ ผลจึงผ่านในเครื่องตัวเองแต่ตกในระบบ
- การเรียกซ้ำที่ไม่มีเงื่อนไขหยุด หรือลึกหลายแสนชั้น ทำให้หน่วยความจำของสแตกหมด
- อ่านข้อมูลเกินหรือขาด เช่น โจทย์ให้ n แล้วตามด้วย n ค่า แต่โค้ดอ่าน n+1 ค่า
วิธีหาให้เร็ว: ลองข้อมูลที่ค่าสุดขอบทั้งสองด้าน (เล็กสุดและใหญ่สุดตามโจทย์) ถ้าหยุดที่ค่าใหญ่สุด มักเป็นขนาดอาร์เรย์ ถ้าหยุดที่ค่าเล็กสุด มักเป็นการหารหรือลูปที่ไม่ได้ทำงาน
Time Limit Exceeded: เช็กลูปไม่จบ แล้วค่อยคิดเรื่องความเร็ว
ขั้นแรกให้ตรวจว่าลูปทุกตัวจบจริงไหม ตัวแปรที่ใช้เป็นเงื่อนไขเปลี่ยนค่าทุกรอบหรือเปล่า ถ้าลูปจบแน่ ค่อยถามว่าโปรแกรมทำงานกี่ครั้งเมื่อข้อมูลใหญ่เท่าที่โจทย์อนุญาต
// นับคู่ (i, j) ที่ a[i] + a[j] == k จากข้อมูล n = 200000 ค่า
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++) // ประมาณ 20,000 ล้านครั้ง ไม่ทันในทุกภาษา
if (a[i] + a[j] == k) answer++;หลักคร่าว ๆ ที่ใช้กันในสนามแข่งคือ คอมพิวเตอร์ทำงานง่าย ๆ ได้ราวหนึ่งร้อยล้านครั้งต่อวินาที ตารางนี้ช่วยเดาว่าวิธีที่คิดทันหรือไม่ก่อนลงมือเขียน
| รูปแบบการทำงาน | สัญลักษณ์ | n = 1,000 | n = 200,000 |
|---|---|---|---|
ผ่านข้อมูลรอบเดียว | O(n) | 1,000 | 200,000 |
เรียงข้อมูลแล้วผ่านรอบเดียว | O(n log n) | ราว 10,000 | ราว 3.5 ล้าน |
ลูปซ้อนสองชั้น | O(n²) | 1 ล้าน | 40,000 ล้าน |
ลูปซ้อนสามชั้น | O(n³) | 1,000 ล้าน | ไม่ต้องคิด |
โจทย์นับคู่ด้านบนจึงต้องเปลี่ยนวิธี เช่น เรียงข้อมูลก่อนแล้วใช้ตัวชี้สองตัว หรือเก็บจำนวนครั้งของแต่ละค่าไว้ใน map ซึ่งเป็นเนื้อหาของค่าย 2 ส่วนในค่าย 1 สิ่งที่ต้องทำให้ได้คือนับรอบของลูปตัวเองเป็น การย้ายจาก Python ไป C++ ช่วยได้เมื่อวิธีถูกอยู่แล้วแต่ช้าไปหลายเท่า ไม่ช่วยเมื่อวิธีทำงานเป็นหมื่นล้านครั้ง
เช็กลิสต์ 6 ขั้นก่อนส่งใหม่
อ่านโจทย์อีกรอบ ขีดเส้นใต้เงื่อนไขทุกคำ
มากกว่า หรือ ไม่น้อยกว่า, ติดกัน หรือ ลำดับใดก็ได้, นับค่า หรือ นับตำแหน่งดูข้อจำกัดของข้อมูล
n ใหญ่สุดเท่าไร ค่าสูงสุดเท่าไร ผลรวมล้น int ไหม ต้องใช้ long long ตั้งแต่ตอนรับค่าหรือตอนบวกสร้างเคสเล็กสุด เคสขอบเขต และเคสซ้ำ แล้วไล่ด้วยมือ
เขียนค่าตัวแปรทุกรอบลงกระดาษ ไม่มองโค้ดแล้วเดานับรอบการทำงานที่ n ใหญ่สุด
ถ้าเกินหนึ่งร้อยล้านมาก ให้เปลี่ยนวิธีก่อนแก้รายละเอียดตรวจรูปแบบผลลัพธ์ให้ตรงทุกตัวอักษร
ช่องว่าง การขึ้นบรรทัด และไม่พิมพ์ข้อความที่โจทย์ไม่ได้ขอเปลี่ยนอะไรสักอย่างด้วยเหตุผล แล้วค่อยส่ง
จดไว้ว่าแก้อะไรเพราะอะไร ถ้าผลเหมือนเดิม จะได้ไม่วนกลับมาแก้จุดเดิม
นักเรียน คอร์ส C101 ฝึกวงจรนี้ใน Grader ที่ตรวจด้วยชุดทดสอบแบบเดียวกับสนาม และมี AI วิเคราะห์โค้ด บอกจุดที่ควรดูโดยไม่เฉลยคำตอบ
ติดนานแล้ว ถามผู้สอนอย่างไรให้ช่วยได้ตรงจุด
ส่ง 4 อย่างนี้มาให้ครบ ผู้สอนจะบอกจุดที่ต้องดูได้ในข้อความเดียว
- ลิงก์หรือชื่อโจทย์ และผลตรวจที่ได้ ระบุว่าชุดไหนผ่าน ชุดไหนตก
- วิธีคิดเป็นภาษาของตัวเอง 2 ถึง 3 บรรทัด ก่อนโค้ด
- โค้ดทั้งไฟล์ ไม่ใช่ภาพถ่ายหน้าจอบางส่วน
- เคสที่ลองแล้วและผลที่ได้ โดยเฉพาะเคสที่คิดว่าควรผ่านแต่ไม่ผ่าน
ถ้าตอบ 4 ข้อนี้ได้ครบ หลายครั้งจะเจอคำตอบเองระหว่างพิมพ์ ซึ่งเป็นทักษะที่สอบท้ายค่ายต้องใช้ เพราะในห้องสอบไม่มีใครให้ถาม
แหล่งอ้างอิง
ข้อมูลที่เป็นกฎเกณฑ์อ้างอิงประกาศทางการตามรายการนี้ และระบุวันที่อ่านล่าสุดไว้ด้วย เงื่อนไขเปลี่ยนได้ทุกปี ก่อนสมัครให้ตรวจประกาศฉบับล่าสุดของปีที่จะสมัครอีกครั้ง
- ประกาศที่ 74/2568 เรื่องโครงการ TOI-Zero ปี 2569 (เกณฑ์คะแนน 80 ต่อข้อ) (เปิดในแท็บใหม่)อ่านล่าสุด 13 ตุลาคม 2569
- ระบบ TOI National Grader (หน้าโครงการ TOI-Zero) (เปิดในแท็บใหม่)อ่านล่าสุด 13 ตุลาคม 2569
- ธรรมนูญและหลักสูตรคอมพิวเตอร์โอลิมปิก ฉบับปรับปรุง 2568 (การวิเคราะห์ประสิทธิภาพอยู่ในค่าย 2) (เปิดในแท็บใหม่)อ่านล่าสุด 13 ตุลาคม 2569
FAQ
คำถามที่พบบ่อยเมื่อส่งโค้ดไม่ผ่าน
คำถามที่นักเรียนถามเราในแชทบ่อยที่สุดระหว่างฝึก
แทบไม่เคยใช่ ตัวอย่างในโจทย์มีไว้แสดงรูปแบบข้อมูล ชุดทดสอบจริงมีเคสขอบเขตและเคสใหญ่ที่ตัวอย่างไม่มี ให้สร้างเคสเล็กสุด เคสค่าตรงขอบเงื่อนไข และเคสข้อมูลซ้ำแล้วไล่ด้วยมือ
หายเฉพาะเมื่อวิธีคิดถูกต้องแต่ช้าไปไม่กี่เท่า ถ้าวิธีทำงานเป็นหมื่นล้านครั้ง เปลี่ยนภาษาก็ไม่ทัน ให้นับรอบการทำงานที่ข้อมูลใหญ่สุดก่อน แล้วเปลี่ยนวิธีถ้าเกินหนึ่งร้อยล้านมาก
ปี 2569 ข้อที่จะนับต้องได้ตั้งแต่ 80 จาก 100 คะแนน ได้ 79 ยังไม่นับ คะแนนบางส่วนบอกว่าวิธีถูกในชุดเล็ก แต่ยังมีเคสที่พลาด มักเป็นชนิดข้อมูลล้นหรือเงื่อนไขขอบเขต
สาเหตุที่พบบ่อยคือตัวแปรไม่ได้กำหนดค่าเริ่มต้น อ่านข้อมูลจากไฟล์แทนที่จะเป็น standard input พิมพ์ข้อความเกินที่โจทย์ขอ หรือทดสอบด้วยข้อมูลเล็กเท่านั้น ให้ลองเคสใหญ่สุดตามโจทย์ในเครื่องก่อนส่ง
ดูว่าประกาศอาร์เรย์ใหญ่เกินที่โจทย์ต้องการหรือไม่ เช่น อาร์เรย์ขนาดล้านช่องหลายตัวทั้งที่ใช้ไม่กี่หมื่น หรือเก็บข้อมูลซ้ำหลายสำเนา ลดขนาดให้พอดีกับข้อจำกัด และใช้ชนิดข้อมูลที่เล็กพอ
ติดต่อทีมงาน
สอบถามหลักสูตร
และวางแผนการเรียน
ทีมผู้สอน CodeChampion พร้อมช่วยประเมินพื้นฐาน และวางแผนการเรียนที่เหมาะสมกับเป้าหมายและระยะเวลาของน้อง


