iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Modern Web

後端攻略筆記系列 第 5

Day 5 : Go語言 slice 與 map - 延伸練習HW 2

  • 分享至 

  • xImage
  •  

用 Go 學習 Slice 與 Map — 「筆記本工廠」題目實作

今天我們用一個簡單、生活化的題目來練習:


題目:Count the Notebooks

📒 情境:
一家筆記本工廠收到不同供應商提供的紙漿。

  • 1 公斤紙漿 可以製成 1000 頁紙
  • 1 本筆記本 需要 100 頁

現在工廠想知道:

  1. 所有供應商加總起來,總共可以製作多少本筆記本?
  2. 每一位供應商各可以製作多少本?

輸入格式

  • 第一行:整數 T,表示有幾筆供應商紀錄
  • 接下來 T 行:每行包含
    • 供應商名字 (不含空格)
    • 供應的紙漿重量 (kg)

輸出格式

  • 第一行:輸出總共可以製作的筆記本數量
  • 接著:每一行輸出 <供應商>: <數量>

範例

輸入:

3
Alice 1
Bob 100
Charlie 50

輸出:

1510
Alice: 10
Bob: 1000
Charlie: 500

解題思路

  1. 我們需要先把全部輸入存起來,這時候可以用 slice 來裝 Supplier 結構。
  2. 接下來要計算每個供應商能做幾本筆記本,用 map 來做統計剛好方便:
    • map[string]int → key 是供應商名稱,value 是 notebooks 的數量。
  3. 最後再把總和算出來,並輸出。

Go 程式碼實作

package main

import (
        "fmt"
)

// 定義一個結構體儲存供應商資料
type Supplier struct {
        name   string
        weight int
}

func main() {
        var T int
        fmt.Scan(&T)

        // 用 slice 儲存輸入
        suppliers := make([]Supplier, 0, T)

        for i := 0; i < T; i++ {
                var name string
                var weight int
                fmt.Scan(&name, &weight)
                suppliers = append(suppliers, Supplier{name, weight})
        }

        // 用 map 統計各供應商的 notebook 數量
        notebookMap := make(map[string]int)
        totalNotebooks := 0

        for _, s := range suppliers {
                notebooks := (s.weight * 1000) / 100
                notebookMap[s.name] += notebooks
                totalNotebooks += notebooks
        }

        // 輸出總數
        fmt.Println(totalNotebooks)

        // 為避免重複輸出同一供應商,把結果獨立處理
        alreadyPrinted := make(map[string]bool)
        for _, s := range suppliers {
                if !alreadyPrinted[s.name] {
                        fmt.Printf("%s: %d\n", s.name, notebookMap[s.name])
                        alreadyPrinted[s.name] = true
                }
        }
}

逐步講解

  1. suppliers := make([]Supplier, 0, T)

    • 宣告一個「空的 slice」,容量先設好,準備存所有輸入的供應商資料。
  2. notebookMap := make(map[string]int)

    • 使用 map,key 是供應商名稱 (string),value 是 notebooks 的數量 (int)。
  3. notebookMap[s.name] += notebooks

    • 如果同一個供應商出現多次輸入,這裡會直接把 notebook 數量累加上去。
  4. alreadyPrinted map

    • 保證我們輸出時,不會因為供應商重複輸入而印好幾次。

學到什麼?

  1. Slice 適合存「有順序」的資料,例如一串輸入紀錄。
  2. Map 適合做「快速查找」或「統計歸類」,例如每個供應商能做多少本。
  3. 兩者搭配,就能同時保留「輸入順序」又能「快速統計」。

📘 小練習:

  • 如果你要輸出結果時,照供應商的 字母排序 排列,該怎麼改程式?
    (提示:可以把 map 的 key 抽出來放進 slice,然後用 sort.Strings 排序再輸出)

✅ 就這樣,你學會了如何用 Go 的 slice + map 來完成一個小專案題目!



上一篇
Day 4 : Go語言 slice 與 map - 延伸練習HW
下一篇
Day 6 : Go語言 slice 與 map 應用練習 - 補充
系列文
後端攻略筆記13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言