Menu
Coddy logo textTech

ネストされたループからの Break

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 2/68。

入れ子になったループを扱う際、通常の break 文は最も内側のループのみを終了します。しかし、Goは外側のループから直接抜け出すことを可能にするラベルを提供しており、複雑なループ構造を正確に制御できるようになります。

ラベルは、ループの前に配置する、コロンが続く識別子です。その後、break の後にラベル名を指定することで、入れ子になったループの中からでも、その特定のループを終了させることができます。

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i == 1 && j == 1 {
            break outer
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

この例では、条件 i == 1 && j == 1 が満たされると、break outer は内側と外側の両方のループを即座に終了します。これは、2次元データ構造を検索する際に、目的のものが見つかった時点で検索を完全に停止したい場合に特に便利です。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

このチャレンジでは、ラベル付きの break ステートメントを使用して、2次元グリッドを検索する際にネストされたループから抜ける練習をします。グリッド内の特定のターゲット番号を見つけ、見つかったらすぐに検索を停止する必要があります。

2つの入力を受け取ります:

  • "rows,cols" 形式のグリッドの次元を表す文字列(例:"3,4"
  • 検索するターゲット番号を表す文字列(例:"7"

以下の数値の2次元グリッドが提供されています:

grid := [][]int{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
}

あなたのタスクは以下の通りです:

  1. 最初の入力から次元を解析し、検索する行数と列数を決定する
  2. 2番目の入力からターゲット番号を解析する
  3. ラベル付きの break を伴うネストされたループを使用してグリッド内を検索する
  4. ターゲット番号が見つかったら、"Found [target] at position ([row], [col])" と出力し、ラベル付き break を使用して直ちに両方のループを終了する
  5. ターゲットが見つからずに検索が完了した場合は、"Target [target] not found" と出力する

位置は0ベースのインデックス(最初の行は0、最初の列は0)を使用して報告してください。

チートシート

ラベルを使用すると、ネストされたループ内から外側のループを抜けることができます。ラベルは、ループの前に配置される、コロンが続く識別子です。

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if condition {
            break outer  // 両方のループを終了します
        }
    }
}

break の後にラベル名を指定することで、深くネストされた構造からでも、その特定のループを終了できます。これは、2次元データを検索していて、ターゲットが見つかったら完全に停止したい場合に便利です。

自分で試してみよう

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    // 入力を読み込む
    var dimensions string
    var targetStr string
    fmt.Scanln(&dimensions)
    fmt.Scanln(&targetStr)
    
    // 次元の解析
    dimParts := strings.Split(dimensions, ",")
    rows, _ := strconv.Atoi(dimParts[0])
    cols, _ := strconv.Atoi(dimParts[1])
    
    // ターゲットとなる数値の解析
    target, _ := strconv.Atoi(targetStr)
    
    // 事前定義されたグリッド
    grid := [][]int{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    }
    
    // TODO: 以下にコードを記述してください
    // ラベル付きのbreakを使用したネストされたループでターゲットを検索します
    
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン