APCS解題策略|實作滿級分高手經驗分享

Bar 主
CodingBar
Published in
35 min readOct 6, 2021

本線上講座舉辦於 2021.08.13(五),節錄並整理講座分享的精華內容,另有當日直播影片可以觀看。

每個月第二週週五晚上定期舉辦,報名近期講座請點我。文章更新第一手資訊,敬請鎖定 CodingBar 程式教育部落格專欄

主講者:林品安 — — 陽明交通資工 升大一

高中原本就讀市立大同高中,後因熱愛程式故重考會考,選擇板橋高中就讀,為尋求資訊奧林匹亞國手學長的指導。來到板橋高中後,每日花 3~4 小時練習程式,在高一下的時候即取得 APCS 實作滿級分,高二在全國資訊學科能力競賽取得三等獎的成績。

高三上以特殊選才的方式錄取交大、清大、成大等五間學校資工系,最終選擇就讀陽明交通大學資訊工程學系。

主持人:林士翔 — — CodingBar 創辦人

CodingBar 創辦人,曾任 BenQ、洋華光電等科技業管理職,在與世界各國人才交流的過程,深感台灣教育需要改變,才能培養出符合新世代的人才;因此創辦瑞比智慧科技 airabbi,以及青少年程式教育服務 CodingBar,希望透過科技翻轉教育,培養出具有國際競爭力的下一代!

前言

本次講座將針對 APCS 程式檢定解題策略與練習方法做分享,以及品安的程式學習經歷與興趣啟蒙過程,內容豐富精彩,推薦各位找段空閒時間好好閱讀。

本次分享主題並不會多加著墨於 APCS 的基本介紹,如果你對於 APCS 程式檢定了解不深,歡迎先閱讀以下資料:

精選文章:學程式為什麼要考 APCS?APCS 程式檢定是什麼?

影音介紹:什麼是 APCS?科技教育大哉問 #06

Part1 個人經歷與興趣啟發

大家好我是林品安,我就讀中和國中美術班、大同高中普通班,在大同高中的時候有學過一點程式,但是實作能力只有 APCS 一級分的程度,我國中的時候會自己修電腦、玩電腦,因為我家電腦不太好,常常故障,所以在修電腦的這個過程中開始對資訊產生興趣,開始喜歡上電腦,然後會去圖書館翻程式語言相關的書。

後來我想要更進一步加強程式能力,剛好有認識的學長在打資訊奧林匹亞,引起我想要參加資訊奧林匹亞的興趣。那個時候 APCS 還不流行,大概是第一年舉辦吧?但大同高中之前沒有人打過奧林匹亞,我就想說要重考高中,重考到那個時候有奧林匹亞國手的板橋高中,去跟那位國手揣摩學習,所以我會考考了兩次,是比較特殊的經歷。

很多人會問我,為什麼會從美術班跳到資訊這個領域?

其實我覺得人生就是一個摸索自己興趣的過程,美術班讓我發現自己沒有那麼喜歡畫畫,所以我就轉到了資訊這個領域。

在板橋高中高一那年,我就拿到了 APCS 實作題五級分的成績,今年高三我透過特殊選才申學管道,錄取了清、交、成、中央、師範這五間學校的資工系,我只有申請這五間,也通通都有拿到錄取資格,後來選擇陽明交通大學就讀。

Jerry:「想請問品安為什麼沒有選擇清大,而是選擇交大就讀呢?」

品安:「這是一個宗教戰爭,有些人覺得清大資工比較好,有些人覺得交大資工比較好,我自己覺得在演算法這個領域是交大資工比較強,而我也是專門研究這個領域,所以我選擇交大資工來就讀。」

所謂的教學相長

你們會發現我有蠻多教學經驗,我教了兩年的板中資訊校隊與資訊社團,我覺得教學經驗可以讓自己對每個演算法有更深入的學習。另外是如果能有個 partner 可以一起學習是很不錯的,像我在板中高二高三的時候,都有個同屆的同學跟我一起切磋成長,後來我們都有考到 APCS 滿級分,他也透過特殊選才上了清大資工。

有個人跟你一起切磋會讓你更有動力,一起寫題目、一起搞笑出 BUG,都變成很有趣的事情。

你會需要慢慢付出努力然後得到收穫,你可以看到我高一的時候 APCS 實作題 5 級分,這時候我已經寫程式寫了一年多,才終於獲得實作題滿級分,而且是很密集的寫,因為我除了寫程式以外其實沒有花很多時間在唸書,我成績不算是很好。

Jerry:「品安這邊給大家很大的鼓勵,大概一年多的時間,你就可以從 APCS 實作一級分拼到五級分。

品安:「對我來說我的目的是資訊奧林匹亞,所以不能用同樣的角度去看待程式。如果有人已經寫程式一年多還沒拿到五級分,這絕對不是什麼可恥的事情,因為我每天至少都花三個小時以上寫程式,才可以只花一年時間拿到 APCS 實作五級分。」

也不要覺得自己都學了一年拿不到五級分可能笨笨的,很多人都是兩三年才能拿到五級分,蠻正常的,畢竟我就是花所有的時間在程式上,因為我的學業成績贏不了別人。

檢定與競技程式介紹

程式檢定的部分有 APCS 大學程式設計先修檢測CPE 大學程式能力檢定 這兩個,再來競賽就是各校的資訊學科能力競賽,但不是每間學校都會舉辦,因為有些學校參賽的人太少,你只要有報名就會直接參加市賽,我第一間念的學校大同高中,只有不到 10 個人來參加我那個年度的校內賽;以板中來說會有 50 個人來參加,然後取 5 個去參加新北市賽,所以每一間學校競爭力不同。如果你在台北市例如說建中,可能沒辦法在校內賽拿到好成績,對手太強,或者是你有拿到好成績,可能就是直接代表台北市出去了,每間高中狀況不同,所以要去問一下你學校的校內賽。

TOI 臺灣國際資訊奧林匹亞競賽,你只要 APCS 實作考三級分,就可以去參加資訊奧林匹亞的初選,但是基本上三級分的人去打奧林匹亞初選,就是去拿個證書而已,因為你不可能上,能進奧林匹亞的人基本上都是實作五級分的,資奧的部分後面還有更多介紹。

YTP 少年圖靈計畫HP CodewarNPSC 網際網路程式設計全國大賽ISSC 青年程式設計競賽 這些都是團體賽,團體賽作為升學的用途並不大,因為躺分太容易,像我自己資安競賽就躺分到第一名,我的隊友是全國資安競賽冠軍,所以這個第一名其實跟我沒什麼關係,教授也會斟酌在團體賽的成果。另外我高三那年 NPSC 是有進到決賽,我也沒拿出來講,因為隊友很強,但就當作累積經驗,團體賽那個緊張感不是你平常會有的,這邊只是告訴各位我有參加過資安跟機器人相關比賽,之後我選擇了演算法。

高中能作為升學的三大領域:機器人、資訊安全、演算法。

如果各位對資訊相關領域有興趣的話,就是朝這三個領域去做鑽研,比較能夠作為特殊選才升學的一個備審資料。

機器人有 FRC、RC 相關競賽,我的同班同學用特殊選才上了交大電機,他參加很多機器人創造發明相關比賽,但不一定是台灣的,像中國有些機器人競賽也是蠻有公信力,範圍很廣,但我不是這方面的專家。

資安相關競賽有 金盾獎My First CTF 可以去查詢看看,成大T貓盃在升學上比較沒什麼用,因為參與的人較少,我的專長是演算法,對另外兩個領域我就不多做評論。

競賽心得與經驗分享

各位可以看到我的競賽成績,新北市資訊學科能力競賽高一的時候拿佳作,高二的時候第四名,高三拿到第一名,所以我也是慢慢的成長;但是給你們一個反例,我高二的全國賽拿了全國三等獎,但我高三的沒有列出來,因為拿了個幾乎墊底的名次。

為什麼要講這些?想告訴各位我不是一個天才,我就是靠努力去堆出我現在的程式能力,高中數學也不是會考 100 分的人,大概就是平均 60 而已,不是特別聰明。

相信很多人都會有疑惑就是:我會不會比較笨?我會不會輸別人?會不會進步得比較慢?我可以告訴大家我已經是好友圈裡面進步最慢的了,所以只要你肯付出努力,你一定會進步得比我快啦!

程式的興趣啟蒙

從小我就是對科學很好奇的小孩,我是個好奇寶寶,什麼問題都會問我爸媽,但我爸媽不一定回答得出來。國中的時候在打英雄聯盟,用一台破破舊舊的筆電,有時候打一打就會跳 GAME,家裡人不常用電腦,所以我需要自己修電腦,為了修電腦而自己去查資料,然後開始覺得欸電腦好像蠻有趣的。

國中會考的時候去圖書館念書,但是念久了會累,就想做點別的事情,不過我對漫畫比較沒興趣,就去翻了有一櫃櫃子都是程式語言的書,我也不知道為什麼運氣這麼剛好,就選到 C 語言的書,我就這樣開始看起了 C 語言。

Jerry:「品安當初拿到 C 的書怎麼會覺得有興趣?很多人可能看了就昏倒了。」

品安:「我覺得就是挑重點看,避免看書看到序就睡著了,我翻開 C 語言的書其實就直接翻到程式碼的地方去看,當你看到 #include <iostream> 等等還有輸出 helloword 的這段教學,只要照著這段程式碼打,就可以輸出一樣的東西,就代表我學會了這一步,學習就是照著做然後獲得成就感。」

上高中之後接觸了 FRC 比賽與資訊安全比賽,也接觸了 APCS 然後考了一級分嘛,三個領域都接觸後,會發現肯定是對某一個領域比較有興趣,我發現我對解題、對 APCS 是比較有興趣的,我印象深刻的是,我一開始學動態規劃的背包問題,我覺得「可以拿記憶體去換速度」這件事情很酷!然後我就愛上演算法了!於是我開始決定要往演算法發展。

來到板橋高中後,因為我國中會考算是蠻認真的唸,但社會科還是考了 B++ ,我發現我就是背不起來,我不想因此繼續在學測或指考失利,所以我決定要做一件不一樣的事情,於是選擇了程式。

做決定的前置作業

有個很重要的概念必須跟各位強調,當你決定要做一件事情的時候,一定要先搞清楚它的後路與所有規則,當我決定要走特殊選才的時候,我已經把奧林匹亞的所有升學管道跟中獎的機率都查了一遍,奧林匹亞國手有幾個、保送名額有幾個、推薦名額有幾個、特殊選才每間學校收幾個、什麼樣的 Level 什麼樣的程式能力可以上哪些學校⋯⋯ 我全部都查好了才決定要邁向這個方向,我不是我想寫程式然後就埋進去了。

因為你必須先查好所有資料,才有辦法說服爸媽支持你走這條路

這是我覺得當初做得蠻好的一件事情,我爸媽當時聽完我做的這些資料,他們是有被說服的,那當然不完全接受,但既然我都查了這麼清楚了,那他們願意聽我怎麼說。

確定我想寫程式之後,我就轉到板橋高中,這也是一個家庭革命,高中重考不管在誰的眼裡都是一件很奇怪的事情,但當時對我來說這已經是我的夢想,我覺得人生不差這一年,如果晚一年出社會,能夠從什麼事情都不知道的小孩,變成我很確定我想寫程式的小孩,我覺得是蠻值得的。

Jerry:「108 課綱很強調讓大家早點找到興趣,品安非常難得,他很早就找到想要努力的方向與目標,而且堅持地朝著這條路走,也能感受到家長剛開始可能不是很贊成,對不對?」

品安:「對,完全不贊成。」

Jerry:「所以你做了很多功課去說服他們,這邊也鼓勵在講座上的各位同學,一定要趕快把你自己的興趣和未來想走的路找出來,才能花比較少的力氣好好專注在那條路上。」

資訊奧林匹亞

這些都是網路上很公開的資訊,給大家一個輪廓,有興趣的同學可以再深入研究。

奧林匹亞每年錄取 30 個人進資訊奧林匹亞選訓營,這叫做第一階段,第一階段的 30 個人是沒有升學的保障,選訓營裡會再進行比賽,選出第二階段的 12 人並獲得「推薦名額」,是奧林匹亞可以直接向大學推薦你這個人,當然也要自己寫一些備審資料與準備在校成績等等,但是因為你已經夠強了,所以大學其實不太會看其他的東西。

需要注意的是,獲得前 12 名的推薦名額不保證能上台灣大學,但是你一定會上台大、交大、清大其中一間,因為台大不收的人清交一定會收,畢竟你是全台前 12 名。

那這前 12 個人還會進行比賽選出全國前 4 名是為「國手」,國手沒有「保送名額」,但是如果你出國比當年的國際比賽拿到任何一個獎項,你才具有保送的資格,所以保送的資格不是由國手資格來定,而是由你拿到的無論是金牌、銀牌、銅牌的那張牌來決定。保送是什麼?保送是你想要去哪間,你一定會進那間學校,學校一定得收你除非特殊例外。

所以全國只有 12 個人可透過程式進入理想的大學?那我要怎麼寫程式上大學?其實進入選訓營的那 30 人裡面,其他 18 個人都可以藉由「特殊選才」上大學,基本上一定會上,因為你是除了那 12 個人裡面最頂尖的,保證上哪間大學我沒辦法跟你說,但我身邊的人都有上最想上的學校。

即使你不是進選訓營的那 30 個人,像我就是沒有進選訓營的人,我是全國大概 34 名之類的,邊界,如果能在其他比賽拿到不錯的成績,像我在全國賽拿到三等獎,還是可以藉由特殊選才的方式上大學,錄取我想上的交大,但風險比較大,也需要你展現出額外的動機,像我就是重考為了打資訊奧林匹亞,教授看到我對資訊的熱愛。

如果你沒拿到三等獎,也沒拿到資訊奧林匹亞前三十名怎麼辦?那你的 APCS 成績也是可以拿來特殊選才的,APCS 考高分的人也不算是多。

Part2 如何從零開始學程式

為什麼要學程式?

這方面是我特別想跟大家說的,因為我熱愛程式所以我想推廣程式。為什麼要學程式?現在很多大學科系無論文理組都有程式相關必修,我也是最近才知道連藝術學院都要學程式,包括我朋友申請文組科系也會說自己會寫程式,因為他真的會寫程式,程式好像已經是台灣人人都該知道的東西。

在高中端,接觸到的老師不一定那麼厲害,也不一定會認真教程式,當然也有好老師,運氣問題,但我覺得課外學絕對比你在課堂上學到的東西多,推薦各位可以去多多了解程式,就算你沒有要拿程式去升學。

再來就是在職場上,程式是未來趨勢,會程式絕對是加分不會是扣分,加的分也一定比你會其他東西還要多,像我蠻會打球的,但是會寫程式一定比會打球加的分多一點。

理工科系常常需要將程式結合自己的專業,什麼意思?像物理系就需要用程式來算一些物理相關的參數,不可能都用手算,所以你還是需要會程式,並不是今天你不讀資工、不讀電機就不需要用到程式,這是一個錯誤的觀念,不論你讀什麼科系都有機會用到程式,除非你真的是非常文組、非常藝術、非常音樂之類,只要你讀工或者商,基本上都還是用得到。

Jerry:「這邊我小小補充一下,約莫兩年前教育部開始 推動大學程式設計教學計畫,目標要有 50% 以上的大學生會程式,我們陸續知道像是中興外文系、中山大學外文系、甚至是 CodingBar 公司對面的臺北科技大學應用英文系,程式設計都變成他們的基礎必修課,當初聽到我們也蠻驚訝的。

也是告訴各位同學,不要覺得好像要逼大家學程式,應該有更宏觀的視野,當 AI 時代來了,很多事情都要透過人工智慧處理,即使只是了解基礎的程式概念,在你的工作上一定很有幫助。

聊天室這邊有同學問到『醫科需不需要學程式?』,如果有在注意新聞的話,現在很多在判別 X 光片甚至電腦斷層掃描,也是用人工智慧在處理,我們身邊也蠻多醫生在學程式的,給大家參考。」

如何從零開始學程式?

如果你想要先自己開始試試看學程式,但不想要透過任何人的幫助,可能你還害羞、還不想跟別人交談,那你就是去網路上找資源、找家教、找補習班,先從學習基礎語法開始,學習陣列、迴圈、if-else 這些基礎語法,這些都是網路上ㄧ查就有的東西,例如說直接打「C++ 語法」就會出來基礎的東西。

我想傳達的是學習方法 — — 理解別人的程式碼。

理解不了的話,你就沒辦法進行下一步,當你理解程式碼之後就先照抄,看看是否能得到一樣的東西,那基本上照抄一定會出現一樣的事情(除非你電腦有問題),照抄完之後就可以再寫一次程式碼,我記不記得剛剛的程式碼怎麼寫?我是不是真的理解這個程式碼在幹嘛?當你能夠再寫一次,你才能自己再寫出另一份程式碼,如果連剛剛照抄的那份都寫不出來,那怎麼能夠寫出獨一無二的程式碼?

學習完基礎語法後的下一步,就是學習 APCS 的演算法,也是先理解演算法、照抄一次演算法,演算法不是只有理解概念而已,像是廣度優先搜尋、深度優先搜尋, 理解完之後,你要知道怎麼實際寫出來,用你的腦子一步一步去思考演算法是怎麼操作的,然後用自己獨一無二的方式寫出來,所以一個演算法會有一萬種寫法,每個人都不一樣,這是我覺得學習 APCS 的一個過程。

第一步照抄程式碼,第二步重現程式碼,第三步自己動腦、動手實作演算法。

希望你如果卡關了、不知道怎麼學習的人可以參考一下,理解真的很重要,而不是照抄也不是背,理解了、操作了、自己來,這樣才是真正的學會,我覺得程式也沒辦法背啦,我就是不想背社會科才來寫程式的嘛。

有人問說:「學了程式沒辦法像書上一樣做出成果,也不知道 Bug 在哪怎麼辦?」

我簡化一下他的問題,這問題大家都會有,我自己也每天都在遇到,Debug 是需要經驗的,如果你真的找不到 Bug 的話,可以上網搜尋該題目的 Solution 解答之類,如果還是找不到又沒有人可以問,隨便在 Facebook 上面找個社團發文問,不要怕被別人罵,因為你身邊沒有認識會寫程式的人,如果你沒踏出這一步,你就永遠不會變強。

跟大家說我剛開始怎麼學程式的,我在打英雄聯盟的時候認識一個人,他是當年資訊奧林匹亞選手,直到今天我們也沒見過面,我就是直接問他說可不可以教我程式,要告訴學弟妹們,如果真的想做任何事情、想得到資源,你就得願意跨出丟臉這一步。

Jerry:「品安有好朋友互相砥礪、競賽,然後你上了交大,他上了清大,那我們身邊學生的例子也是,要找一個可以跟你志同道合在資訊這塊,兩個一起努力,有問題就互相教導督促。如果身邊真的沒有這樣的資源,或是你覺得透過網路上來學習很辛苦很累,也歡迎大家來找 CodingBar,我們常常辦這樣講座的目的,也是希望讓大家不要像海上的浮木找不到資源,我們這邊有很多資源,可以針對各種需要來幫助大家。」

品安:「其實我當初也被羞辱得蠻慘的,所以大家不要怕,我被羞辱了整整兩三年,直到我有點起色後,才能開始跟人家對談討論,加上我的圈子是比 APCS 五級分更強的圈子 — — 資訊奧林匹亞,我在裡面真的算是很笨的,有時候跟人家五個人圍著聊天,我都聽不懂人家在說什麼,那這很正常,不要覺得很丟臉,我就是硬要跟你們聊天,我就是想要學東西,所以這是我一個蠻重要的信念,就是要主動。」

Part3 練習方法與解題策略

實作級分向上突破

這邊是給 APCS 已到達三級分的人,基礎語法不管是 Python 還是 C++ 都已經沒有問題,再來就是學習新的演算法,因為太多的演算法會出現在 APCS 裡面了,動態規劃、圖論、分治法⋯⋯ 還有一些比較複雜的綜合題,光是圖論就包含很多演算法在裡面,動態規劃也不是只有一個動態規劃,所以你們需要去一項一項的學並且學懂,才能考取更高的級分。

迴圈、陣列、if-else 這三項「顧好」,就可以三級分。

顧好的意思是,寫很多 APCS 的考古題,把迴圈弄得很熟很熟,你很確定在寫 C++ 或者 Python 的時候不會出現奇怪的 Bug,舉個例子,索引值在 C++ 裡面不能出現負數,這就是常見的新手會犯的 Bug,雖然大家都知道這不能犯,但是你要在考試時,每份程式碼都不會出現這個問題,這就是經驗上的差距,把這些小 Bug 都彌補起來,那三級分應該是沒問題。

鍛鍊解題的「想法」與程式碼「實作」,才能達到四五級分。

當你已經有三級分的實力,你在練習題目上,絕對不要像以前一樣只是照抄東西、卡關就看老師解答,你必須先思考一道題目一定的時間,以四五級分的程度,你想一道題目想了 20–30 分鐘都想不出來,才可以去看解答,或是詢問周圍的人提示,有人可以問的話,不要去問程式碼怎麼寫,而是去問想法,有了想法之後自己去寫出該想法的程式碼。

同時鍛鍊你的想法與實作是很重要的,「想法」就是你腦袋能不能想到,「實作」就是讓你的程式碼去實踐想法,所以如果你去問了別人的想法,卻也直接看了程式碼,你就少掉了鍛鍊實踐想法的這個部分。

考場環境模擬練習

再來推薦各位一個很奇怪的練習方法,應該是在座 99% 的學生都沒做過的,就是模擬考試環境,在家就這麼做,自己找四道題目,要確定題目是在 APCS 的難度以內,寫完四題之後再一次提交,因為我們最怕是寫了滿分的想法,但是程式碼有 Bug,可是 APCS 不能馬上知道自己的程式碼有沒有答對,所以你必須平常在家就練習你的實作能力。

如果你不知道題目難度有沒有在 APCS 的範疇裡面,這個我無從幫起,就是只能問認識的人或者找考古題,再來是增加臨場感,計算時間、不要跟其他人講話、不要找網路資源,讓你熟悉考場的感覺。

程式練習時間分配

很多人都很好奇要怎麼分配時間來寫程式,那我覺得要看你的目標在哪裡,目標很重要,你想要學會程式、會寫程式就好,還是想拿來升學用途?你的目標是 APCS 1–5 哪個級分?想放學測備審資料、走特殊選才、或者想打奧林匹亞當國手?每一個不同的目標都會有不同的時間分配。

以我個人為例,我很確定我不會考學測跟指考,因為我超討厭唸書,我自己高ㄧ還是有 all pass,但是我高一沒有拿到保送或推薦的名額,所以我知道這樣下去不行,我比較笨,我需要付出更多時間在練習程式,而不是花更多時間在唸書,所以我把時間分配為 10–20% 在唸書,80% 在家裡寫程式,我媽甚至允許我不用去上課,相信不是所有小孩都能做到這樣。如果不是這麼誇張的要朝這條路走,只是想考個 APCS 的程度,寫程式的時間是不會影響到課業成績的。為什麼呢?因為我高一 all pass 但是 APCS 有拿到五級分。

所以,這是一個自我自律要求的問題。

你一天能否把玩耍的時間拿 1–2 小時拿去寫程式,把寫程式當作第二個休閒活動,平日每天花個 0.5–1 小時,大概是想考三、四級分的 Level;如果想考五級分,每天應該至少花 1 個小時在練習。

那假日的話我也會跟同學出去玩,但不會每週都跟同學出去玩,所以假日就是拿去玩耍或者做練習,假日花個 3 小時來寫程式,是想考四五級分應該做到的事情,如果你連假日都沒辦法花到 3 小時練習的話,不太可能考到四五級分。

我自己有在教別人寫程式,像是我板中的學弟,那他們也花大概九個月到一年的時間就考到五級分,或者接近五級分的成績,因為我沒去確定他們每個人的成績,但我確定他們都有五級分的實力,那他們是怎麼考到五級分的?每天放學都來電腦教室找我,至少練習 1–2 小時,假日也會問我問題,我也會開課幫他們上課,換算起來假日每天有花個 3 小時左右,平日每天 1 小時,一年左右的時間到達五級分。

相信這不是很難的一件事情,只是你有沒有辦法自律而已。

兼顧課業的困難度

相信剛剛所闡述的時間並不會影響到你的課業,我不相信一個高一生每天回家都在唸書,如果你是建中附中成功,或者各縣市的第一志願,我沒有讀過那種學校,所以沒辦法告訴你如何兼顧課業,我自己讀板中的時候,是覺得每天花 1 個小時寫程式並不會影響到你在班上的排名。

Jerry:「我是師大附中畢業的,現在有一個暑假升高二的女兒,我都跟她說,高一其實就是要多元發展,重點是要找出未來想走的路,就像品安在國中就發現對資訊有興趣,所以他寧可多考一次會考也要朝這條路前進,所以高一的時候不要太去斤斤計較那些成績,趕快把你想走的路找出來,未來才會比較輕鬆。

國立台灣大學統計發現,每年約有 6% 的學生休學,之前親子天下也有做過一個調查,台大生覺得自己選對科系、不會想轉系的只有四成多的比例,代表一半的人想要轉系,或不確定他唸的科系是否自己喜歡的。

所以很鼓勵大家,如果你才高一或國中生,就該多去嘗試不同領域找出自己有興趣的,以後就好好的專注在這部分,把它變強,不用在高一就很計較學科的成績。」

品安:「有人說我成績跟程式都普通怎麼辦?我只能說很多人都這樣,所以看你想怎麼發展,唸書?寫程式?還是兩個都發展。」

Part4 題目來源與題庫介紹

每個 Judge 後面括弧的數量是我練習的題數,如果寫過的題目數量很少的話,表示這個題庫我相對沒那麼熟悉,我所提供的意見可以當作參考就好。以 Zerojudge 來說我寫了 391 題,高中的時候我才寫了兩百多題,大部分是我高中畢業後再繼續刷的題目。

Zeorjudge(391題)

我覺得 Zerojudge 算是個不用寫太多的 judge,因為他有很多題目是網路上的人生的,沒有特別經過審核就放上來,所以題目比較參差不齊,很多怪人出怪題,答案也很奇怪。Zerojudge 最重要的東西是 APCS 考古題,因為你要考 APCS 就要寫過考古題。EOF 輸入的那個東西跟 APCS 實際考試也有落差,APCS 從來沒出過這種東西,所以 Zerojudge 練習個 50–100 題把語法練熟悉,然後寫一些 APCS 考古題就好了,這是我的個人淺見。

TIOJ(601題)

TIOJ 我寫了六百多題,我是 TIOJ 裡面刷題數量前十名, 所以我對這個 Judge 非常熟悉,他是一個建中架的網站,我覺得上面很多題目都出得非常好,但是題目難度並沒有照題號排序,它從 1000 開始排序,甚至我 1010 就不會寫, 可能就是個一輩子寫不出來的難度,所以會需要有人能帶著你寫,像是你的學長或者老師。

CodeForces(702題)

CodeForces 是一個非常多選手在使用的網站,我寫了七百零二題不算多,因為它有很多簡單的題目。題目是有分類的,你可以用 tag 來尋找你想練習的演算法,但題目都是英文的,以我自己為例,我高中英文被當四學期,只有高一那兩學期有過,但我還是看得懂 CodeForces 的所有英文題目,所以高中英文程度跟看不看得懂題目是兩回事,你只要多寫些題目,你還是看得懂英文相關的資訊題目,可能會有像是 integer、string 這些常見的英文單字。

英文很重要,這是真的很重要,因為如果你跨過 APCS 五級分這個檻,想要往奧林匹亞邁進,所有我們在練習的題目都是英文的。CodeForces 的題目是有難度分類的,以 100 為級別,如果以 APCS 為目標的話,難度到 1500 差不多就是極限了。

CS Academy(30題)

我在這裡只有寫了 30 題,有區分為 Easy、Medium、Hard 三個難度的題目,Easy 大家可以試試看,應該寫得出來,Medium 就有點難度了,那絕對不要去碰 Hard 的題目,會很浪費你的時間,這也是一個不錯的 Judge 但我高三才知道它,所以只寫了 30 題。

AtCoder(100題左右)

這是一個有 Beginner Round 新手練習語法的地方,大概有五六題可以挑前三題寫,通常都是程式碼不到十行的題目,這是個給 APCS 實作題考 1–3 級分的人可以練習的地方。

LeetCode(100題左右)

LeetCode 是我比較不建議高中生練習的地方,因為它的傳送方式不是把程式碼複製貼上然後 submit,而是要寫成一個 class,但是 class 不會在 APCS 裡面用到,如果你很熟悉 LeetCode 那可以繼續在上面練習,它的題目有分難度也有分類別。我這兩三個月開始寫了大概 100 多題,對這個 judge 還不算熟悉,目前感覺題目沒有到很糟糕都可以去寫寫看。

我看很多人都喜歡比題數:「欸你刷了兩百題我刷了三百題你好廢喔!」沒有用,你刷了兩千題可能還是沒有很強,重點是理解每一道題目然後去融會貫通。題庫的刷題題數不代表一切,我刷了幾千題但也還不是全台保送的前幾個人,為什麼?因為我可能不夠努力、不夠聰明、刷了一些水題沒去刷難題都有可能,所以不要想著你刷了五千題就應該怎樣,沒有,有些人可能只刷了四五百題,但那四五百題都是超難的題目。

Jerry:「不知道同學們有沒有聽出來,品安這兩三個月還是不斷的在寫程式,跟升學考試已經沒有絕對關係,這算是興趣還是練手感呢?」

品安:「算是興趣吧,就覺得一天沒寫題目就很無聊(笑)。不是每個人都這樣啦,也不要覺得以升學為目標寫程式是件很可恥的事情,應該大部分人都是這樣,我當初高一高二的時候也是想著『打奧林匹亞就可以保送好爽喔!』的心情就去寫程式了,當然興趣佔多數,但一定有這種心思,所以不會很奇怪,雖然我後來還是沒有保送因為我太爛了…… 」

Part5 特殊選才心態與制度

希望各位是對程式真的非常有興趣才去做這件事情,因為真的每一個人都很厲害,但是有個非常重要的概念必須要告訴大家:特殊選才上頂大超級難,要上台大、交大、清大要像我們一樣花很多時間才能上的,但是如果不是清交成中央這些,你其實 APCS 實作題考四級分或五級分都有機會,但也要一些別的佐證,例如說多益 990 很高分之類,或者是其他資訊、數學相關的經歷,不過因為我也沒有丟這些學校所以我也沒辦法保證。

品安的 github 部落格(hakkaz.github.io)有紀錄面試過程中遇到的所有問題,有興趣的人可以去看看。

書審的部分就是客觀分數,APCS 或者奧林匹亞的考試分數決定的,以清交來說沒有在乎我的在校成績,因為我的在校成績是全校倒數的,不跟各位唬爛,我是全校最後一名成績畢業的,那清大交大給我的書審成績還是有 90–95 分,因為我的競賽成績算是蠻頂尖的。

面試技巧很重要,這就跟你的競賽成績完全沒有關係了,你必須展現你的面試技巧,回答教授的問題,並不是你拿了很好的競賽成績你的面試就會沒問題。

特殊選才的門檻,頂大就是資訊奧林匹亞與資訊全國賽,不是看 APCS 就可以上的,那中字跟師字需要 APCS 4–5 級分,都是指實作題成績,沒有人在看觀念的,觀念題鑑別度沒那麼好,所以觀念成績在特殊選才上比較沒那麼有用。

Jerry:「我覺得你的例子蠻振奮同學的,全校成績倒數還是可以錄取陽明交大,這在以前我們聯考年代基本上不可能發生。現在很多大學教授也開始發現,其實找對的學生比找成績好的學生重要,找到對我這個科系有興趣有熱情的學生,遠比成績好但進來之後不想念、不想寫程式的更重要。我要問品安一個很關鍵的問題,你覺得你可以同時錄取交大、清大的關鍵原因是什麼?」

品安:「我覺得是教授看到我的熱忱,因為我就是為了唸奧林匹亞重考;再來我也的確得到了相關的獎項,教授也認可我的實力;以及大家可以看我在兩百多人的會談裡面也是很健談,所以我的口條在面試的部分是完全沒有問題,那這也是蠻重要的一個因素。

我有個朋友學測上了交大,但他在特殊選才的時候交大的面試表現不好,即使他的能力比我還要好很多,卻在特殊選才落榜了。各位也不要因為自己不擅長面試而放棄特殊選才這條路,因為面試是可以練習的。」

Jerry:「大家要有個觀念,如果要靠申請入學或者特殊選才進入大學,你要站在教授的立場去想他怎麼找學生?他要哪一種類型的學生?品安就是一個很好的例子:讓教授看到對資訊的熱情、透過競賽獎項證明自己的實力、並且在面試的時候良好的傳達出來。

平常一定要鍛鍊好你的溝通表達能力,台灣學生比較容易吃虧的是,我們可能有八成的實力,但是講出來好像只剩下三成;跟我們對岸的同胞比,我遇過很多明明只有三四成的實力,講出來卻都有九成十成的信心,鼓勵大家在學校裡面,不管是參加社團或活動,一定要多訓練你的表達能力,像品安我相信你面試應該也拿到不錯的分數?」

品安:「都比書審成績高(笑)。順便補充一下我是怎麼練習面試的,我在資訊社團教學了兩年,也帶了培訓兩年,所以在人多的場合講話我是不會害怕的,那不是每個人都有這個環境可以練習,我幫班上同學練習的方法就是,我自己當教授直接去問他問題,你也可以找一個這樣的朋友。」

問答時間與觀眾提問

報名表提問彙整

Q:有時候演算法一直卡關,複習的時候又忘記怎麼辦?

A:卡關很正常,直到現在我練習演算法還是會有學不會的,因為我就是看不懂,可能可以理解個 70–80% 但我沒辦法完全理解,每個人都有他的上限。再來就是需要花時間去理解,不是今天看了就會馬上懂,就像你唸書你不會學了個數學公式,馬上就能夠應用在所有地方,所以卡關是正常的。

但忘記是很少見的,因為演算法理解之後,就應該至少兩三年內要記得,四年前我學一個 BFS(廣度優先搜尋法)我到現在寫一個出來只要幾分鐘,這是很正常的事情,因為你理解演算法後不太容易會忘記,如果你是容易忘記的人,那就是再看一次程式碼或教學的文章,這應該不會花太多時間,因為你曾經有理解它,就只是再重新想起來而已。

Q:為什麼學完演算法也沒辦法考好 APCS?

A:那這個答案很明顯,你把數學講義寫完你也不會 15 級分,就這樣。

Q:怎麼知道自己適不適合寫程式?讀資工?

A:你如果有興趣寫程式,看程式碼不會覺得無聊,然後你對資訊、科技領域、AI、機器學習,對網路上感覺很瞎趴的東西很有興趣的話,那你應該是蠻適合讀資工的。

再來是不怕挫折,因為在這個領域上我覺得會遇到比其他領域更多的挫折,因為你要看更多更新的知識,學程式語言需要細心,也會遇到很多 Bug,找不到 Bug 的時候不要太煩躁,這些都是看你適不適合唸資工的因素,我自己是超級有興趣,對於電腦的東西我都覺得好猛喔!我想學!

Q:講座的證書作為備審資料有效果嗎?

A:因為我不是什麼教授或者相關人士,所以今天講座的證書作用相當不大,但它可以作為你曾經在乎過 APCS 的證明,我相信拿到這個證書就是不虧。不過 APCS 分數在學測備審資料裡面是佔得非常重的,因為當大家學測分數都相同的時候,教授要怎麼決定誰能夠錄取?台大自己有筆試,所以它會以自己的筆試成績為主,但清大、交大每年都那麼多人考了差不多級分,通常你要有寫過一點程式、有程式相關的佐證才會比較好錄取。

Q:每天花如此長的時間去練習程式,要怎麼兼顧課業?

A:前面剛好有提過,大致來說就是取決於你的升學管道,你要怎麼升學來決定你要花多少時間寫程式、你的程式成績要多好,依照我自己身邊資訊圈朋友的例子,有特殊選才、保送錄取的,學業成績有很好也有很壞的,但中間的例子比較少,因為在校成績很好的就是他很聰明,所以他成績跟程式都能兼顧做到很好,那像我學業成績很差,就是放手一搏,多花很多時間在努力寫程式上面。

所以如何兼顧也要看你自己資質如何,能唸得起數學的話,通常程式不會太差,但你數學很差的話可能就不要走冤枉路,程式可能不太適合你,但也有數學很差的程式很好啦,所以我不會以一概全。

Q:學程式有沒有推薦的書籍?

A:我從來沒有看書來學過程式,我就只看過第一本在圖書館借來的 C 的書,所以沒辦法推薦你,網站的話可以參考 PCSHIC 坡路特石講義的 0–4 章,第四章後面的東西都是奧林匹亞的範圍。但因為這是我們國手學長寫的,所以可能切入的點沒那麼初學者,如果你天資聰穎可以試著用這個學,我自己的話是沒辦法那麼快理解,要自學可以考好我覺得真的有點難。

書籍在這個時代已經不是這麼被廣泛流傳的東西,網路上可以找到更多的資料,你去買一本書就只能看到這裡面的資料,但是用 Google 你可以翻閱每一個網頁有什麼資料,所以我會建議各位用 Google 來學習程式。

Q:為什麼自學會很難考到較高的級分?

A:要自學考好真的是很難的一件事情,因為很多資源你是沒辦法自己獲得的,即使你能獲得資源,這邊自學的定義是沒有人可以問,所以當遇到問題一旦你卡住了,有些問題是你想一輩子都想不出來的,以我自己為例子,當年動態規劃背包問題我卡住了,如果我沒有學長可以問我永遠搞不懂,因為邏輯的東西一旦你卡到的你過不了。所有演算法都是偉大的結晶,但是演算法也有很多都不用學,沒有人帶你的話你會學到很多 APCS 不會考的東西,我身邊沒有什麼案例是自學可以考到五級分的,當然一定有但是不多。

Jerry:「鼓勵大家最好有一個群組,大家一起學,彼此砥礪也可以避免大家走冤枉路。」

品安:「你如果在自學程式,然後讀的是每個縣市第一志願、或台北市那幾間有名的學校,基本上你們學校一定有人比你會寫程式,厚著臉皮去向他們請教一定會有成果,就我認識的像建中一屆就有十個人會寫程式,其他學校像我待的板中,寫程式的人就真的不多,比較多可能還是在唸書或在玩耍,要找資源就是從網路上去找人。」

Q:實作題如何從三級分提升到五級分?

A:我個人認為基礎演算法都學完了,那就是多寫題目去熟悉這些演算法,加上要拿好部分分數,APCS 會有 20 或 30 分這種給分,不要某一題是零分,如果不幸有一題零分,那其他題目請務必 40 分拿滿,這樣就有四級分了,前面兩題沒有兩百基本上就沒有四級分了啦。前面兩題兩百了,後面兩題湊出個 50 分你就四級分了 — — 多寫題目,多湊分數。

四級分到五級分就是不能失誤,加上你要學更多的演算法,為什麼?基本上你如果有在 CodingBar 上過課的話,應該是可以應付所有的 APCS 考題,但是當你學更多演算法,就像學了更多的數學公式,你可以用比較難的方法解比較簡單的題目,聽起來像是殺雞焉用牛刀,但是多學不虧,就是這樣的概念。五級分真的不容易,連我自己都沒把握每次考都能五級分,基本方法就是多學多練習,沒有一個什麼唸書的套路,因為寫程式跟唸書不一樣,每個題目都有不同的解法,不像考試有背可能就有分數。

Q:APCS 第三、第四題的範圍大概在哪?

A:動態規劃、圖論、資料結構,這些都能再向下細分,我沒辦法很清楚的說出範圍在哪,以我來說我去考 APCS 會用到的東西就是這三項夠用,但因為我有去考奧林匹亞,所以我還會用其他比較難的方式去解 APCS 的題目(承上題的殺雞用牛刀),但主要範圍就那三個。

Q:現在升高三才開始學來得及嗎?

A:我是建議你剩半年要學測還是先乖乖唸書,這個賭太大了,當然我們有認識的選手花半年就當上國手,但是高一高二開始做這件事情比較沒有壓力,你剩一年就要學測了,不太可能剩半年直接拼到一個國手,這樣壓力超大,可以學測考完開始學程式,用於丟備審資料這樣。

聊天室現場提問

Q:對資安有興趣,但都找不到相關資源怎麼辦?

品安:「我只能跟你說資訊安全相關的資料真的超級難找,連我自己在這個高中資訊圈的領域打滾這麼久,都沒辦法有很充沛的資源,因為都集中在少數的資訊安全選手身上,他們也不是不願意分享,只是資訊安全相關的東西真的很難學,也很跳痛,不像程式學了就會有成績,範圍超級廣,沒辦法隨便學什麼東西就上手,所以如果你想得到相關資源,我也沒辦法告訴你該怎麼找,再來就是要去爬多點關於 CTF 的文章,希望有幫助。」

Jerry:「我的高中死黨在趨勢科技的資安部門擔任主管,資訊安全是個很窄很專業的領域,一般人要進去很不容易,流通在外面的資訊沒那麼多,所以會不好找。但我鼓勵大家包括未來對資訊工程有興趣的,你們要好好培養英文能力,因為最新的程式技術大概都是用英文寫出來的,不管是新的程式語言、演算法、論文,都是用英文寫的,不能說我只要拼程式就完全把英文荒廢,當你唸到更進階的時候,你就會卡關,資訊安全的東西也是,鼓勵大家英文跟程式能力都要共同培養。」

Q:圖論的三個最短路徑算法有沒有用?APCS 會不會考?

A:我覺得考的機率不高,因為它們在理解上還算蠻難的,但是我覺得這三個東西你可以至少學一個,既然都知道有這個東西了,如果 APCS 突然考了一個最短路,那你至少會其中一個可以拿到部分分數,學一下不虧。

Q:建議學什麼語言開始?

A:如果你對程式沒有很強烈的興趣,從 Python 開始會比較好,像我自己是從 C 開始,因為我對於程式就是很有興趣,所以從 C 開始對我來說沒有很難。

Q:考 APCS 學越多語言越好嗎?

A:絕對不會越多越好,因為你只會用一個語言來回答。

Q:請問高二高三是不是很難兼顧 APCS 與成績?

A:看你的智商還有自律程度,這些可能都不是我能決定的。

Q:請問對一般人來講不追求滿級分,拿幾加幾算是不錯?

A:看你付出的時間,我覺得觀念至少拿個五,如果實作能拼到四級分蠻賺的,因為四級分的人就蠻少的。

Q:高三進入一階沒進二階是不是來不及特殊選才?

A:是,但是強烈建議你如果沒辦法上頂大的話,隔年再拼特殊選才隔年上大學,這樣做是挺賺的啦。

Q:目前高三已經考取四級分,建議要拼五級嗎?

A:我覺得乖乖念書,四級分很夠了,以高三來說時間不多。

Q:想請問我之前有學資料結構,跟演算法是一樣的概念嗎?

A:這兩個是截然不同的概念,資料結構是很好理解,但是要知道怎麼使用它。演算法是要知道理解它,並且能夠運用在題目上,像我個人對資料結構的理解就是比較快,演算法比較慢。

Q:如果備審資料放物理學的資料,對申請資工系有幫助嗎?

A:我認識的學弟他今年要申請特殊選才,他在物理、數學、資訊方面的造詣都挺高的,那這絕對會比只會資訊的人還要有幫助,因為其實物理要結合資訊也不是很困難的東西,你多點東西就是放嘛。

Q:請問品安高中是選什麼類組?選類組對報考資工會有影響嗎?

A:我自己是二類自然組,類組我覺得不會有影響,你做的事情才決定申請資工系教授看到的東西,你如果一類組但資訊奧林匹亞進一階,那教授憑什麼不要你?我知道有個國手就是台南一中的一類組,那他為什麼要讀一類組?因為他覺得一類組他背一背就能 all pass 不用花太多心力去讀書。

Q:APCS 會需要用到 Segment Tree 去解題嗎?

A:我在 APCS 用過很多次 Segment Tree 與 Binary Index Tree 去解題,但是都可以不用這些東西解題,但如果你會的話,在 APCS 裡面會無往不利,很多分治的題目都可以用這些來解決,真的超有用的那種。

Q:很多人會問 TQC、MTA 有沒有幫助?

A:相關的證照在學測一定是有幫助的,證明你對程式有興趣、你會寫程式,那在特殊選才的部分效用並不大,尤其是清交成,因為大部分人都已經有奧林匹亞、全國賽甚至是 APCS 的成績,所以其他的就會比較沒那麼有用。

Q:會演算法跟資料結構,但是在考場上寫不出來怎麼辦?

A:我覺得這是大部份人都會有的問題,所以想特別拿出來講,你學會演算法跟資料結構後,需要拿它去做非常大量的題目,才能在考試測驗的有限時間內寫出來,考試最大的限制就是在有限的時間作答,你不能無限制的發想下去,如果你今天寫不出來、想不出來題目怎麼做,基本上都是練習不夠,沒有什麼特別的辦法,因為一個演算法可以應用在很多不同的狀況下,當然可能跟天賦也有關係,有些人可能練習三題就能融會貫通,有些人可能像我比較笨就要練習個一百題,才能寫出延伸的題目。

結語

不管你現在幾年級,都建議大家趕快發掘自己感興趣的方向,現在各個大學教授要選的不是成績特別好,而是適合唸該科系的學生,你們要想想自己的目標科系的教授,會想要哪種類型、什麼條件的學生。另外是,全國大概三分之二的科系都開始重視程式能力,即使是文組的同學,考個觀念實作題分別 2–3 級分,也是很有用,程式會像未來的英語一樣成為必備能力。

如有任何問題想深入了解,歡迎透過 LINE : @codingbar 與我們聯繫,將有專人為您說明。

CodingBar程式設計領航學校 致力於透過程式教育,培養青少年邏輯思考與創新應用的核心能力。
誠摯邀請您與我們一起打造台灣新世代的教育工程!

--

--