Go練習問題2-09:整列と検索を理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題2-9:整列と検索を理解しよう

この問題を解くために必要な知識:
レベル1の知識論理演算子と代入演算子条件分岐(if-else文)条件分岐(switch文)ループ処理(for文)ラベルとgoto文無限ループ配列スライスとキャパシティ整列と検索マップループ処理(range文)サードパーティパッケージ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「整列と検索」とは





ここでは整列と検索の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語における「整列と検索」の基本的な文法

Go言語には、配列やスライスのデータを操作するために便利な「整列」と「検索」の機能が備わっています。

これらの機能を使用すると、数値や文字列のリストを昇順や降順に整列したり、特定の要素を効率的に検索することができます。

整列の基本

Goでは、sortパッケージを使用してスライスを整列します。たとえば、整数のスライスを昇順に整列するには、以下のようにします。

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 整列したい整数のスライス
	numbers := []int{5, 2, 9, 1, 5, 6}
	
	// 昇順に整列
	sort.Ints(numbers)
	
	// 結果を表示
	fmt.Println("昇順に整列されたスライス:", numbers)
}

このコードでは、sort.Ints関数を使って整数のスライスを昇順に整列しています。整列後のスライスは[1, 2, 5, 5, 6, 9]となります。

検索の基本

Goでは、sort.Search関数を使って、整列されたスライス内から特定の要素を効率的に検索することができます。二分探索アルゴリズムを使用しているため、検索は高速です。

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 整列されたスライス
	numbers := []int{1, 2, 5, 5, 6, 9}
	
	// 値を検索
	index := sort.Search(len(numbers), func(i int) bool { return numbers[i] >= 5 })
	
	// 結果を表示
	if index < len(numbers) && numbers[index] == 5 {
		fmt.Println("値 5 はインデックス", index, "にあります")
	} else {
		fmt.Println("値 5 はスライスに存在しません")
	}
}

この例では、sort.Searchを使用して、スライス内の値「5」を検索しています。見つかった場合、インデックスを表示します。

まとめ

Go言語の整列と検索機能は、データの整理や検索を効率的に行うために非常に役立ちます。標準ライブラリのsortパッケージを使用することで、初心者でも簡単にデータ操作を行うことができます。

データの整列と検索は、アルゴリズムの基本を理解する上でも重要なスキルですので、ぜひ実際にコードを書いて体験してみてください。

Go練習問題2-9:数値の整列と検索プログラムを作ろう

10個の整数を格納した配列をソートし、指定した値が配列内に存在するかを検索するプログラムを作成しましょう。

ユーザーが入力した値が配列に含まれているかどうかを確認し、その結果を表示します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • 10個の整数を含む配列を定義し、その配列を整列(ソート)すること。
  • 整列後、ユーザーから検索したい値を入力してもらい、その値が配列に存在するかを確認すること。
  • 存在すればインデックスを表示し、存在しなければその旨を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

整列された配列: [0 1 2 3 4 5 6 7 8 9]
検索したい値を入力してください: 5
値 5 は配列内に存在し、インデックス 5 にあります。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.標準ライブラリのインポート
 1-1. fmtパッケージをインポート(標準出力を扱うため)
 1-2. sortパッケージをインポート(配列の整列を行うため)

2.main関数の定義
 2-1. numbersスライスの初期化と整数のリストを格納
 2-2. sort.Ints(numbers)でスライスを昇順に整列
 2-3. fmt.Println("整列された配列:", numbers)で整列後の配列を表示
 2-4. fmt.Print("検索したい値を入力してください: ")で検索したい値の入力を要求
 2-5. fmt.Scan(&searchValue)でユーザーが入力した値をsearchValueに格納

3.検索処理と結果の表示
 3-1. sort.SearchInts(numbers, searchValue)で整列済みの配列内での値の検索
 3-2. indexが配列の範囲内かつ検索値が一致するかを条件分岐で確認
 3-3. 検索結果が見つかった場合、インデックスとともに値を表示
 3-4. 検索結果が見つからなかった場合、該当する旨を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import (
    "fmt"
    "sort"
)

func main() {
    // 配列を定義
    numbers := []int{8, 3, 7, 1, 2, 5, 4, 6, 9, 0}
    
    // 配列をソート(整列)
    /* 【穴埋め問題1】
    ここに配列を整列するためのコードを書いてください。
    */

    // ソート結果を表示
    fmt.Println("整列された配列:", numbers)
    
    // ユーザーから検索する値を入力してもらう
    var searchValue int
    fmt.Print("検索したい値を入力してください: ")
    fmt.Scan(&searchValue)
    
    // 配列内を検索
    /* 【穴埋め問題2】
    ここに配列内を検索するためのコードを書いてください。
    */

    // 検索結果を表示
    if index < len(numbers) && numbers[index] == searchValue {
        fmt.Printf("値 %d は配列内に存在し、インデックス %d にあります。\n", searchValue, index)
    } else {
        fmt.Printf("値 %d は配列内に存在しません。\n", searchValue)
    }
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import (
    "fmt"
    "sort"
)

func main() {
    // 配列を定義
    numbers := []int{8, 3, 7, 1, 2, 5, 4, 6, 9, 0}
    
    // 配列をソート(整列)
    sort.Ints(numbers)
    
    // ソート結果を表示
    fmt.Println("整列された配列:", numbers)
    
    // ユーザーから検索する値を入力してもらう
    var searchValue int
    fmt.Print("検索したい値を入力してください: ")
    fmt.Scan(&searchValue)
    
    // 配列内を検索
    index := sort.SearchInts(numbers, searchValue)
    
    // 検索結果を表示
    if index < len(numbers) && numbers[index] == searchValue {
        fmt.Printf("値 %d は配列内に存在し、インデックス %d にあります。\n", searchValue, index)
    } else {
        fmt.Printf("値 %d は配列内に存在しません。\n", searchValue)
    }
}

正解コードの解説

このプログラムは、Go言語を使用して、整数の配列をソートし、特定の値がその配列内に存在するかを検索するという、基本的な整列と検索の操作を行います。

この解説では、プログラムがどのように機能するかをブロックごとに分解して説明します。

パッケージとライブラリのインポート

package main

import (
    "fmt"
    "sort"
)

ここでは、Goプログラムのメインパッケージと、標準出力に使用されるfmtパッケージ、そして整列に使用するsortパッケージをインポートしています。

fmtは出力操作を行い、sortはスライスの整列を簡単に行えるようにします。

メイン関数の開始

func main() {

Go言語のエントリーポイントは常にmain関数です。この関数内で、プログラムの実際の処理が行われます。

配列の定義と整列

numbers := []int{8, 3, 7, 1, 2, 5, 4, 6, 9, 0}
sort.Ints(numbers)
fmt.Println("整列された配列:", numbers)

まず、10個の整数を含むスライスnumbersを定義します。

その後、sort.Ints(numbers)を使用してスライスを昇順に整列します。整列された結果は、fmt.Printlnで表示されます。

ユーザーからの入力を受け取る

var searchValue int
fmt.Print("検索したい値を入力してください: ")
fmt.Scan(&searchValue)

次に、ユーザーに検索したい値を入力してもらいます。fmt.Scan関数を使用して、入力された整数を変数searchValueに格納します。

配列内の値を検索

index := sort.SearchInts(numbers, searchValue)

ここでは、sort.SearchIntsを使用して、整列されたスライスnumbers内でsearchValueを検索します。この関数は見つかったインデックスを返します。

検索結果の表示

if index < len(numbers) && numbers[index] == searchValue {
    fmt.Printf("値 %d は配列内に存在し、インデックス %d にあります。\n", searchValue, index)
} else {
    fmt.Printf("値 %d は配列内に存在しません。\n", searchValue)
}

最後に、検索結果を確認し、値が配列内に存在する場合はそのインデックスを表示します。存在しない場合は、適切なメッセージを表示します。

まとめ

このプログラムは、Go言語での基本的な整列と検索の使い方を学ぶのに適しています。

sortパッケージの便利さと、ユーザー入力を活用する方法を理解する良い機会となるでしょう。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る