---
# System prepended metadata

title: APCS
tags: [APCS, tutorial]

---

# APCS
![APCS-BG](https://hackmd.io/_uploads/BJ86xLdsyx.jpg)
<!-- ![images](https://hackmd.io/_uploads/H1kIZ8usJx.png) -->

:::info
[TOC]
:::
<br/>

## __簡介__
__Advanced Placement Computer Science__， ++大學程式先修檢測++是由台灣大學資訊工程系受教育部委託舉辦的測驗，目標是讓高中生具備基礎的程式設計能力，內容涵蓋 __資料結構、演算法、計算思維__，考制分為++觀念題++與++實作題++，分別評分級分 1~5 級。並且部分大學會將 APCS 成績納入招生評分或抵免學分使用。

![image](https://hackmd.io/_uploads/SyB1-q_sye.png)

<br/>

## __測驗內容__
- APCS 主要分為兩大部分：[作答系統說明](https://apcs.csie.ntnu.edu.tw/index.php/info/systemdescription/)

    1.__觀念題__ ==（40 分鐘，共 25 題，每題 4 分）==
    :::danger
    ++可以跳題，有必要時可以先跳複雜或需要大量計算 !++
    :::
    - 內容涵蓋：
        a. 演算法與資料結構（排序、搜尋、堆疊、佇列、遞迴等）
        b. 記憶體與變數範圍
        c. 基礎計算與邏輯運算
        d. 控制結構（迴圈、條件判斷）
        e. 物件導向程式設計（Class、Method、繼承等）
        f. 運算效率（時間與空間複雜度分析）

    2. __實作題__ ==（150 分鐘，共 4 題，每題 100 分）==
    :::success
    ++第一題永遠是最簡單的，這分數一定要拿 ~++
    :::
    - 內容涵蓋：
        a. 讀取輸入、格式化輸出
        b. 陣列、字串處理
        c. 遞迴與分治法
        d. 基礎圖論（BFS、DFS）
        e. 動態規劃（DP）
        f. 資料結構（Set、Map、Linked List）
        g. 模擬（Simulation）
        h. many others

<br/>

## __語言選擇__
不同程式語言有不同的特性，在 APCS 或競賽解題中，建議選擇適合自己的語言能幫助你更高效地解題。

- ![img.icons8](https://hackmd.io/_uploads/SyerLX9i0.png) **C++**
    - 🔹 **優點**
        - **執行速度快**：C++ 是編譯語言，效能最佳，適合大型數據運算。
        - **STL（標準模板庫）強大**：內建 `vector`, `set`, `map`, `priority_queue` 等資料結構，讓解題更方便。
        - **手動記憶體管理**：靈活運用 `new`、`delete`，但需注意記憶體洩漏問題。
    - 🔻 **缺點**
        - **語法較複雜**，學習門檻較高。
        - **指標（pointers）概念較難掌握**，需額外花時間學習。
        - 需手動管理記憶體，可能會導致 **記憶體洩漏**（不影響競程但需留意）。
    - **用途**
        1. **APCS 解題**  
        2. **競程比賽（IOI, LeetCode Contest）**  
        3. **高效能系統、嵌入式系統**  
        4. **Unreal Engine**
        5. **各種軟體開發**
:::spoiler **C++ Resource**
- **[C++ Online Compiler](https://onecompiler.com/cpp)**
- **[Dev C++ 官網](https://www.bloodshed.net/)**
- **[MinGW64+vscode 安裝教學](https://www.youtube.com/watch?v=8QdDlNOMCgA)**
:::
---

- ![img.icons8](https://hackmd.io/_uploads/Hks3Um5j0.png) **Python (v2/v3)**
    - 🔹 **優點**
        - **語法簡單直覺**，適合初學者。
        - **強大內建函式庫**，可快速處理數據（`sum(list)`, `sorted(list)`）。
        - **適合數據分析與 AI/機器學習**，如 NumPy, Pandas, TensorFlow。
    - 🔻 **缺點**
        - **執行速度慢**：Python 是 **直譯語言**，相較 C++ **慢 10~100 倍**。
        - **變數型別是動態類型（dynamic typing）**，容易出錯（如 `list` vs `tuple`）。
        - **記憶體管理較自動化，但難以最佳化**，影響大數據運算的效能。
    - **用途**
        1. **不建議用於 APCS 解題**  
        2. **AI / 機器學習（ML）**  
        3. **數據分析、腳本開發**  
        4. **高階軟體開發**
:::spoiler **Python Resource**
- **[Python Online Compiler](https://www.onlinegdb.com/online_python_compiler)**
- **[Google Colab 官網](https://colab.google/)**
- **[Python 官網](https://www.python.org/)**
- **[Jupyter Notebool](https://jupyter.org/install)**
:::
---

- ![img.icons8](https://hackmd.io/_uploads/Hkk9_Q9oC.png) **Java** (較不建議)
    - 🔹 **優點**
        - **語法中等**：比 C++ 友善，不需手動管理記憶體（**自動垃圾回收 GC**）。
        - **物件導向（OOP）強大**，適合大型專案開發。
        - **內建類別豐富**：如 `ArrayList`, `HashMap`, `TreeSet`，處理資料較方便。
    - 🔻 **缺點**
        - **執行速度較慢**：Java 透過 **JVM** 執行，速度比 C++ 慢 2~5 倍。
        - **程式碼較冗長**，有較多樣板程式（boilerplate code）。
        - **IO（輸入輸出）較慢**，可能需使用 `BufferedReader` 最佳化。
    - **用途**
        1. **APCS 官方推薦語言**  
        2. **物件導向開發**  
        3. **企業級應用（Spring, Android 開發）**  
        4. **各式軟體開發 (Mobile 為主)**
:::spoiler **Java Resource**
- **[Java Online Compiler](https://onecompiler.com/java)**
- **[Java 官網](https://www.java.com/zh-TW/)**
:::

<br/>

### _++簡易示範題目++_
<< [ZeroJudge - a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) >>
- 題目:
    - 敘述: 請寫一個程式，讀入兩個數字 a, b，並求出它們的和。
    - 輸入格式:
        - 每組輸入共一行，內含 兩個整數 `a` 和 `b`，以空白隔開。
        - 整數 `a`, `b` 的絕對值皆小於 $10^9$。
    - 輸入格式: 對於每組輸入，輸出該 兩整數的和。
    ---
    1. C++ 解法:
    ```CPP[]
    #include <iostream>  // 引入標準輸入輸出函式庫
    using namespace std;

    int main() {
        int a, b;  // 宣告兩個整數變數
        cin >> a >> b;  // 從標準輸入讀取 a 和 b
        cout << a + b << endl;  // 輸出 a + b 的結果
        return 0;
    }
    ```
    ---
    
    2. Python 解法:
    ```Python[]
    # 讀取輸入，並以空白分割成兩個數字
    a, b = map(int, input().split())
    print(a + b) # 計算並輸出結果
    ```
    ---
    
    3. Java 寫法:
    ```Java[]
    import java.util.Scanner;  // 引入 Scanner 類別

    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);  // 建立 Scanner 物件
            int a = sc.nextInt();  // 讀取第一個整數
            int b = sc.nextInt();  // 讀取第二個整數
            System.out.println(a + b);  // 輸出兩數之和
            sc.close();  // 關閉 Scanner
        }
    }
    ```

<br/>

## 評分方式
* ![image](https://hackmd.io/_uploads/HJV6MiOiyg.png)
![bd905c8f6d3a7768fe59bb0557f40335](https://hackmd.io/_uploads/HyFsecOikl.jpg)

<br/>

## Q&A
- ++(Q1) **APCS 考試的難度如何？**++  
    APCS 難度依題目而異，一般來說：
    1. 觀念題範圍廣，但大多屬於基本概念與推理題。
    2. 實作題有**遞迴、排序、動態規劃、圖論**等經典演算法，難度大概跟 **LeetCode** 平台上 Easy 題還有 Medium 題的程度。

- ++(Q2) **如何準備 APCS？**++  
    **程式觀念題準備：**
    - 熟悉 **演算法概念（排序、搜尋、遞迴）**
    - 了解 **時間複雜度分析（Big-O 記號）**
    - 練習程式碼 **輸出推理題**（Python、Java、C++）

    **實作題準備：**
    - **刷題**：練習 __ZeroJudge__、__LeetCode (Easy/Medium)__ 題目
    - **熟悉測資測試方式**，學會 Debug 與優化程式碼

<br/>

:::spoiler Relevant
- [大學程式先修檢測](https://apcs.csie.ntnu.edu.tw/)
- [ZeroJudge 平台](https://zerojudge.tw/)
- [LeetCOde 平台](https://leetcode.com/)
:::
