質問ありがとうございます。 問1について、変数x の値にのみ注目したプログラムの動きは以下の通りになります。 ※ xの値は「//斜体」の形で記載しております。 ---------- 整数型: x ← 1 _// x = 1_ 整数型: y ← 2 _// x = 1_ 整数型: z ← 3 _// x = 1_ x ← y _// x = 2_ y ← z _// x = 2_ z ← x _// x = 2_ ---------- プログラムの最後でzにxを代入する際は、xの値が2に変わっていますので、zの値は2になります。 ご不明点ありましたらご連絡ください。
⚠学習前にご確認ください!
・誤りがあった場合に概要欄で訂正している場合があります。動画におかしな点があった場合、まずは概要欄のご確認をお願いします。
・動画で投影している教材は、本動画の概要欄からさいとうの公式LINEに登録頂くと無料でダウンロードできます!
※概要欄で訂正している内容が反映されたものをダウンロードできます。
IPA公式の問題サンプルはこちらです!科目Aの問題もあるのでチャレンジしてみてくださいね🤗
www.jitec.ipa.go.jp/1_00topic/topic_20221226.html
先日科目B受けて無事合格点超えました!
受験直前まで全く対策出来てませんでしたが、この動画の解説のおかげでアルゴリズムの理解が深まり、本番も確信を持って答えを選べました。ありがとうございます!
合格おめでとうございます!
自信を持って答えられたのも素晴らしいですね!
動画で投影している教材はさいとうの公式LINEに登録頂くと無料でダウンロードできます!
無料で教材が欲しい方は概要欄からLINEに登録してみて下さいね!
今回の動画の教材名:
①【最短最速】科目B公式問題20問 問1〜問9
②【最短最速】科目B公式問題20問 問10〜問20
今日無事受かりました!ほぼこの動画のおかげといっても過言では無いです!本当にありがとうございました!これから応用情報に向けて頑張ります。
合格おめでとうございます!
次は応用情報ですか、頑張ってください!
この動画と、公式LINEに載せてる最新版の解説しか科目Bの対策はやってませんが無事8割弱とれて合格することが出来ました。
本当にありがとうございます。
合格おめでとうございます!!
サンプルよりも本番の問題が難しく、手応えなかったのですが845点も取れました。多少時間かかっても実行結果を書いて解いた結果だと思っています。本当にありがとうございました。
合格おめでとうございます!
素晴らしいですね!
本日無事合格することができました。こちらの動画に本当に助けられました、20回くらい見たと思います笑
主さんのように人に説明するつもりで解いて練習すると頭の整理ができておすすめです。今勉強している皆様が無事合格できますように。
合格おめでとうございます!
わざわざご報告いただき嬉しいです!
記載いただいている通り人に説明するレベルまでいければ完璧ですね!
2.2.20回!?
いつもお世話になっております。
情報系出身ではない私は御チャンネルの動画を見て、アルゴリズムへの苦手意識を解消させ、理解も深めました。おかげで本日基本情報技術者試験に合格しました。
心から感謝しております。
合格おめでとうございます!
嬉しい報告ありがとうございます!
34:56 急に説明飛んで分からなかったけど、tree[1][1]は「treeの1番目の要素の1つ目」ってことなのね・・・。だからorder(2)となるわけか、これは飛ばされたら泣きそう・・・!
ご意見ありがとうございます!
泣かせてすみません。
本問題のような2次元配列は以下で詳しく解説していますので、
よろしければこちらもご覧ください。
【初心者向け】基本情報技術者試験 科目B|アルゴリズムをゼロから理解する
czcams.com/video/waAwVXa9y2o/video.html(問6.配列(応用))
@@itgakko あざっす!
勉強頑張って下さい!
ほぼ一夜漬けでの受験でしたが、この動画だけで午後試験十分な点を取ることができました。問題ごとの手の付け方から詳しい解説まで参考になりました。ありがとうございます。
合格点おめでとうございます!
嬉しいコメントもありがとうございます!
サンプル問題は初見で20問中17問正解できました。
科目Bは「出るとこだけ!」シリーズの参考書を勉強していたので、その成果を発揮できたと思っています。
間違えた問題は、この動画の解説を見て理解することができました!
解説が分かりやすくて助かりました。
来週が試験本番なので、合格の報告ができるように頑張ります!(過去問やサンプル問題含めて、科目A、Bともに及第点はありますが、試験本番は何があるか分からないので、気を引き締めて臨みたいと思います)
いいですね!
来週の試験頑張って下さい!
すごい!
大学の補習授業と並行しているのですが、口頭の説明だけだと分からないこともあり、図やマーカーのおかげでイメージがつきやすく、すごくわかりやすいです!
この動画を無料で提供して下さり、ありがとうございます🙇♂️
コメントありがとうございます!
勉強頑張ってください!
ついに、科目Bが600点越えました!
連続不合格の中、本動画にたどりつきました。
プログラミング未経験でしたが、繰り返し関連動画を参照することで理解が深まりました。
また、質問にも丁寧に回答頂き感謝しかありません
。有名どころの参考書を繰り返すより動画を何度もみることが合格につながったと思います。ありがとうございました。今後の配信も楽しみにしております。
科目B合格点到達おめでとうございます!!
未経験からの合格点到達素晴らしいですね!
またThanksありがとうございます!
より良いチャンネル運営に使用させていただきます!
一夜漬けでFE試験に臨みましたが、科目Bはこの動画だけでなんとかなりました!ありがとうございます!
合格おめでとうございます!!
受かりました!
B試験全く手付かずで焦っていたところこの動画を見つけ救われました…
感謝です。
合格おめでとうございます!
嬉しい報告ありがとうございます!
こちらの動画のおかげであやふやだった問題ごとのアプローチがうまくできそうです!
ありがとうございます!
コメントありがとうございます!
勉強頑張って下さい!
さいとうさんの動画はとても分かりやすので是非2024年の公開問題の解説動画も上げて頂きたいです!!待ってます!!
リクエストありがとうございます!
基本情報合格しました!!
この動画のおかげで理解深めることでき、本番で活かすことができました。本当にありがとうございます。
合格おめでとうございます!
嬉しい報告ありがとうございます!
先生!サンプル問題を人に解説出来るレベルまで仕上げることが出来たのに落ちてしまいました。🥲
やはり試験なので回によっての難易度ってあるものですかね。。。
勉強したことのない分野からの出題が多くとても難しかったです。
質問ありがとうございます!
試験ごとに出題される問題はランダムなので、感じる難易度にある程度のばらつきはあります。
サンプル問題は完璧だと感じるのであれば、その他いろいろな問題を解いてもっと実力をつけると良いですね!
この動画の解説を聞いて理解を深めたことで、合格点を取ることができました!
動画を作成していただき、本当にありがとうございます!
合格おめでとうございます!
合格の助けになりました。
ありがとうございます。
合格おめでとうございます!!
先日、基本情報技術者試験受けて合格しました!理解の難しかった科目Bですが動画の解説のおかげです。ありがとうございました!
合格おめでとうございます!!
本日基本情報を受けて合格できました!
動画とても参考になりました!
ありがとうございます!
合格おめでとうございます!!
試験日が近づいてきました。毎日この動画を見ます。
試験頑張ってください!
基本情報処理技術者を合格しました!解説が分かりやすくとても助かりました。本当にありがとうございました!
合格おめでとうございます!
わざわざ報告頂いて嬉しいです!
試験が今月に迫っていますが、とても参考にさせてもらっています。一緒に解いていくうちに自信もつきます!本当にありがとうございます!
コメントありがとうございます!
試験頑張って下さい!
Thanks機能を解除していただきありがとうございます。お陰様で無事に合格しました。Thanksさせていただきます🎉
改めて合格おめでとうございます!
Super Thanksありがとうございます!
ありがたくいただきます!
お世話になります。
こちらの動画で、無事合格することができました。
5年前に午後試験で落ちて、苦手意識が強かったですが、動画の通り一つ一つ手を動かし回答できました。
感謝の気持ちです。ありがとうございました。
合格おめでとうございます!
苦手を克服して素晴らしいですね!
お陰様で前日670点を取りました。
ありがとうございます!!
✳︎外国人のため、日本語文章を読んだ時、スピードは遅いから、内容は長い問題を二つスキップしました。。
670点素晴らしいですね!
おめでとうございます!
アルゴリズムで🤔←状態だったので、主さんの解説動画で理解が深まりました!新方式頑張っていきます!
ありがとうございます!!
アルゴリズムの勉強頑張ってください🤗
解説ありがとうございます。
基本的なアルゴリズムはできるのですが、少し複雑なアルゴリズムになると苦手意識が出てしまいどうしても勉強が捗れません。
出来れば四月中に取得したいと考えておりますが、こんな私にアルゴリズム(試験B)の勉強法と応援ください。
ご質問ありがとうございます。
勉強法についてですが、アルゴリズムはとにかく問題の量をこなすことが大事です。
また問題の解説を見て復習する際に、ただ単に「理解した」ではなく
「同類の問題を次に解くとしたら解ける」というレベルまで復習することが重要です。
3月下旬にIPA公式のサンプル問題の類似問題の解説動画を追加でアップ予定ですので、
受験までに間に合えばそちらもご利用ください。
基本情報技術者試験の勉強頑張ってください!
お陰様で合格できました✨
ありがとうございました😊
合格おめでとうございます!
嬉しい報告ありがとうございます!
何度かチャレンジして、やっと合格できました!
この動画のおかげです。ありがとうございます!
今後も勉強は続けていきます!
合格おめでとうございます!!
科目Bに苦手意識を持っていたのですが
さいとうさんの動画で各パターンの問題の考え方、
解き方のコツを掴むことができるようになり
無事に試験合格しました☺️🎉
わかりやすい解説ありがとうございます!
合格おめでとうございます!!
ビデオのおかけで1週間対策で科目Bは700点を取れました!ありがとうございました!
合格おめでとうございます!!
今日試験を受けてきました!
受けながら絶対落ちたと諦めてたんですギリギリで無事に合格できました😢
問1すら分からなかった私が合格できたのは間違いなくさいとうさんのおかげです😭貴重な動画本当にありがとうございました!
合格おめでとうございます!
アルゴリズムちんぷんかんぷんだった私ですがこの動画で勉強→再度自分のみで解くの短期間勉強で無事に合格できました!860/1000なので満足の結果です!
本当に感謝しかないです😭ありがとうございます!
合格おめでとうございます!
高得点ですね!わざわざ報告ありがとうございます!
この動画見る前は全くと言っていいほど解き方とか分からなかった感じですか?自分明日試験なんでこの動画みて勉強しようと思ってます!
@@user-bh4qk8ho8p そうですね、ほぼほぼ分かってない状態でした。明日頑張ってください🫡
@@mihapi ありがとうございます!(´▽`)
お陰様で無事に合格しました。ありがとうございます🙏
Thanksでお礼を申し上げたいと思います。
さいとう先生のThanks機能制限がされているようですが、thanksできないです😢
合格おめでとうございます!!
Thanks機能というものがあるのですね、知りませんでした!
機能はオンにしてみましたが、わざわざもう一度Thanksはしなくても大丈夫です!
合格のご報告頂けたのが嬉しいです。
@@itgakko 返事が遅れて申し訳ないです。THANKS機能制限を解除していただきありがとうございます。先程Thanksを申し上げました😌本当にありがとうございました😊
別のThanksコメント確認させていただきました!ありがとうございます!
神様ですか!?
紙での解説も欲しい・・
どこかに載ってたりしますか?
ありがとうございます!
投影している資料のPDF版でよろしければ、動画概要欄から公式LINEに登録して頂くとダウンロードできます🤗
問3のoutの要素数について質問です。
"要素数"という内容から"outの配列の長さ"だと解釈したのですが、ここはどのように考えればoutの中身の3を代入するという思考に至るのでしょうか?
質問ありがとうございます。
動画内8:48あたりから説明している、
i=2の場合の、tail ← out[outの要素数]、
ここでtailに代入される値が
なぜ3なのかという質問だと思います。
記載頂いている通り、「outの要素数」は「out配列の長さ」となります。
i=2の繰り返し処理開始時点で、「out配列の長さ」は 1 ですので、
i=2の場合の、tail ← out[outの要素数]、という記載は、
tail ← out[1] になります。
この時点での 配列out = {3}、となっていますので、
tail に 配列out の 1番目の要素である 3 が代入されます。
不明点ありましたらご連絡いただければと思います。
@@itgakko ありがとうございます。ご説明していただいた内容で理解できました。また何かありましたら質問させていただきたいと思います
よかったです!
@hirohi9370
質問ありがとうございます!
まず、この問題の解答は ウ ではなく カ です。
その上で頂いた
「問3のtailの要素数というのは、要素の個数ではないのでしょうか?」
という質問についてですが、
すみません、この質問の意図を読み取れませんでした。
おそらく頂いている質問はプログラム上の
tail ← out[outの要素数]
こちらの部分を指しておられると思います。
また、さらに記載いただいている以下の内容ですが、
in={3}→要素数1
In={3,2,1}→要素数3
プログラム上では inの要素数を使用している箇所は
for文の繰り返し回数を指定している箇所だけであり、
inは上記のように格納されている値は変化しないため、
何を指されているのか読み取ることができませんでした。
お手数ですが、不明点をより詳細に教えていただければと思います。
これtail←outの要素数=1って考えちゃってるってことですね。実際はtail←out[outの要素数=1]となってout[1]で、現状out{3}だから3ってことです。
解説とても助かっています。ありがとうございます!
問16が難しいです…。
素朴な疑問なのですが、1桁が1ビットとどこかで習って、6桁だと6bitだと思っていたのですが、64bitになるのがよく分からなくなってきました…(2^6で64になるのは理解できました)
質問ありがとうございます。回答します。
まず、記載頂いた「1桁が1ビット」はあっています。
細かいのですが、より正確に言うと「2進数の1桁が1ビット」になります。
コンピュータ上の処理の話で、扱われるデータは 0 or 1 なので、
"2進数の"という枕言葉が必要です。
上記を踏まえた上で、記載頂いている
① 2進数の6桁は6ビット
② 2進数の6桁は64ビット
こちらの違いについて説明しますね。
結論から言うと、どちらも間違いではありません。
ただし、どちらも日本語が一部省略されていて、
① 2進数の6桁「のデータサイズ」は6ビット
② 2進数の6桁「で表現できる値の全パターン数」は64ビット
と補足してあげるとどちらも適切で正しい記載になります。
まず①については、2進数の6桁なので、
1 or 0 が入る箱が6つあるイメージです。
例えば2進数「101010」であれば、以下のようになり、
コンピュータ上でのデータのサイズは 6ビット になります。
|1|0|1|0|1|0|
次に②については、具体的な2進数の値のデータサイズを表しているのではなく、
「6つの箱があれば、表現できる2進数の値は全部で 64(2の6乗)パターンある」
と言う意味になります。
ご質問頂いた内容に対する回答としては以上となるのですが、
問16で頂いた質問ということで、なぜ64で割る必要があるのか、
という部分に疑問があるかもしれませんので、
なぜ64で割るのかを下記に補足で記載しておきます。
何かご不明点などあればご連絡ください。
ーーーーーーーーーーーーーーーーーー
なぜ64で割った余りが後ろの64ビットになるのか、
まず、2進数で話をする前に、10進数の場合で考えてみましょう。
例として、以下の「xxxxxx」の部分に
10進数「333,222,222,111,111」を右詰めで格納する時の処理を考えます。
対象:33xxxxxx 22xxxxxx 11xxxxxx
まず結果だけ見ると、
33000333 22222222 11111111 になりますよね。
これをプログラムで表現するために
計算上どうやっているかを考えます。以下の通りです。
①11xxxxxx の部分を穴埋め
「333,222,222,111,111」の"右側6桁を取得"
この右側6桁を取得するという計算を具体的な計算式で書くと
「333,222,222,111,111」を1,000,000 で割った余り になります
※333,222,222,111,111 ÷ 1,000,000 = 333,222,222、余り111,111
なぜこのようになるかというと、1,000,000で割るというのは、
小数点を6桁右にずらすと同義で、小数点以下にずれた6桁が余りになるからです
また、1,000,000 で割った商、「333,222,222」
つまり小数点を6桁右にずらした結果の小数点より左側の値を
次の②で使用します
②22xxxxxx の部分を穴埋め
「333,222,222」の"右側6桁を取得"
つまり「333,222,222」を1,000,000 で割った余り を取得
また、1,000,000 で割った商、「333」
つまり小数点を6桁右にずらした結果の小数点より左側の値を次の③で使用します
③33xxxxxx の部分を穴埋め
「333」の"右側6桁を取得"
つまり「333」を1,000,000 で割った余り を取得
問16の内容を全ての値が10進数として扱うと
上記のような計算を行うことで結果を得ることができます
ここでポイントなのは、10進数でいう6桁分の値を抽出するには、
1,000,000で割る = 小数点を6桁右にずらす
(10の6乗で割る)
という処理が必要だということです
問16の内容に戻って、2進数で考えるとき
「小数点を6桁右にずらす」には何をすればよいでしょうか。
これが2進数だと「64で割る」という計算になります。
もっとポイントを押さえた形で書くと、「2の6乗で割る」ということになります。
2進数と10進数の違いは1桁あたりで表現できる数字の数になります。
・2進数の1桁で表現できる数字の数は0と1の2パターン、
・10進数の場合は0,1,2,3,4,5,6,7,8,9の10パターン、
その為「小数点をn桁右側にずらす」ためには、
それぞれ上記のパターン数のn乗で割った余りを求める必要があります。
・2進数の場合:2のn乗で割る
・10進数の場合:10のn乗で割る
ーーーーーーーーーーーーーーーーーー
ご丁寧にありがとうございます!64で割る理由がピンときていなかったのですが、10進数で例えてくたさったらとても分かりやすかったです!今後も動画を活用させていただきます…!
@@user-up3mu8qi5v よかったです!
基本情報技術者試験の勉強頑張ってください!
ずっと科目Bが不安でしたが、645点ですがギリギリで合格することができました!
本当にこの動画のおかげで、再帰を始めこれまで理解が難しかったアルゴリズムの問題がしっかりと解けました!!
ありがとうございました!!!
合格おめでとうございます!
報告嬉しいです!ありがとうございます!
わかりやす!
コメントありがとうございます!
勉強頑張ってください!
@@itgakko 合格しました!ありがとうございます。
@akira_in_the_morning 合格おめでとうございます!
基本情報合格しました!さいとうさんのおかげでトレースの仕方が分かり、アルゴリズムを理解していくことができました。ありがとうございました。
合格おめでとうございます!!
ありがたいっす😊
コメントありがとうございます!
購入した科目B対策の教科書では、プログラムの実行結果を表に書くときに、行ごとに結果を書いていました。
この動画では、行ごとの結果を書くのではなく、for文のiの値や再帰関数の引数ごとに結果を書く方法も紹介されていて、2つ目の武器を手に入れることができたのがありがたかったです。
コメントありがとうございます!
勉強頑張ってください!
問9の処理①、②、③はどれですか?
PGの文章の中に番号書いてないとわかりずらいです
あと問題を解いてみて思いましたが、この問題は再帰ってなんでわかるんですか?
order(1)を実行します。
tree[1]の判定
tree[1]={2,3} 要素数2 なので
order(tree[1][1]=2)
tree[2]の判定
tree[2]={4,5} 要素数2 なので
order(tree[2][1]=4)
tree[4]の判定
tree[4]={8,9} 要素数2 なので
order(tree[4][1]=8)
tree[8]の判定
tree[8]={} 要素数0 なので
* 8を出力
endif
* 4を出力←ここでなんで出力されるのですか?(これが一番聞きたいです)
よろしくお願いいたします。
N=8の時は処理③ではないのでしょうか。要素が0のなので処理③だと思います。そこら辺因果関係が不明です
また、8が出力されたら二分木探索上、4しかないから4なのですか?
ご質問ありがとうございます。
まず、問9の処理①②③について、以下の通りとなります。
①order(tree[n][1])
②nを出力
③order(tree[n][2])
上記がわかりづらくすみません。上記を把握していただくと、質問頂いている内容の多くが解決すると思われますので、ご確認のほどよろしくお願いします。
上記だけでは解決しない箇所について下記で回答します。
・この問題は再帰ってなんでわかるんですか
→再帰呼出とは、あるプログラムからそのプログラム自身を呼び出すことを指します。今回は order という関数の中の処理で order が呼び出されているのがプログラムを見てわかるので、再帰呼出だと判断できます。
・4を出力←ここでなんで出力されるのですか?
→簡略化するために n=4、n=8、n=9のケースだけに絞って説明します。以下にプログラムの実行される行を1行1行書きます。わかりやすくするために呼び出した関数のブロックを {~~~} で表しています。
-----------
order(tree[2][1] = 4) { _//order(4)の呼び出し_
if (tree[n]の要素数 が 2 と等しい = true) _//条件がtrue(真)なのでブロック内の3行の処理を実行する_
order(tree[4][1] = 8) { _//order(8)の呼び出し_
_//if文の結果がfalse(偽)となるケースは記載を省略します_
else _//tree[8] = {}なのでelseのブロックに入る_
*n=8を出力*
}
*n=4を出力*
order(tree[4][2] = 9) { _//order(9)の呼び出し_
_//if文の結果がfalse(偽)となるケースは記載を省略します_
else _//tree[9] = {}なのでelseのブロックに入る_
*n=9を出力*
endif
}
_//中略_
}
_//以下省略_
-----------
上記のようにプログラム1行1行の動きを追ってみると、
nの出力順序は 8 → 4 → 9 であることがわかります。
以上、ご不明点などありましたらご連絡ください🤗
@@itgakko
ご回答ありがとうございます。
☆nの出力順序は 8 → 4 → 9
order(8)が呼ばれた
↓
8がブロックに入る
↓
その前でorder(4)が読んであるので、order( tree[2][1]=4 ←(他の解説者もここを省略しているから解説が分かりにくいと私は感じました.)
↓
4を出力する。
↓
4を出力されたら、order(tree[4][2] = 9) { //order(9)の呼び出し
↓
9を呼び出す
という考え方でしょうか
私も再帰というのが分かっておらず質問があやふやになってしまいました。
ご了承ください
@akiper
記載いただいた内容であっていると思います!
プログラムの処理順序については、基本的に上から下!を意識すると良いと思います。
i=4,8,9 の処理をさらに簡略化して書くと以下のようになります。
先ほど記載した処理①、②、③を使って再帰呼出であることを意識しない形にしています。
-----------
order(tree[2][1] = 4) { _//order(4)として呼び出す_
if (tree[n]の要素数 が 2 と等しい = true) _//条件がtrue(真)なのでブロック内の3行の処理を実行する_
処理① _//order(8) の呼び出し_
処理② _//n=4を出力_
処理③ _//order(9) の呼び出し_
_//中略_
}
_//以下省略_
-----------
上記の処理順序を考えてみると、「上から下!」なので処理①→処理②→処理③の順序になります。
それを踏まえた上で、処理①、処理②、処理③の中身を考えると、下記の通りになります。
・処理①では、order(8)として呼び出しているので、その中身で「n=8」が出力され、
・処理②では、そのまま「n=4」を出力、
・処理③では、order(9)として呼び出しているので、その中身で「n=9」が出力されます。
また、動画の中でも触れていたかもしれませんが、再帰呼出については、
「あー、そんなこと(関数の中でその関数自体を呼び出す)もできるんだなぁ」くらいに留めておくのがいいかもしれません。
再帰呼出だから何か特殊なこと(処理順序が変わったり)があるという訳ではないので。
どんなプログラムでも、1行だけをみると複雑なことはしてないので、1行1行理解して読み解いていくのがいいと思います。
またいただいたアドバイスについては改善しますね。ありがとうございます。
以上、ご不明点ありましたらご連絡ください🤗
この動画のおかげで無事合格することができました。
お世話になりました。
合格おめでとうございます!!
ありがとうございます。
コメントありがとうございます!
勉強頑張ってください!
6→❌ 実際に書いてみる
8→△ 実際に書いたらできる
9→❌ 再帰関数の動き方が分からなかった
10→❌
13→△ 実際に書いたらできる
14→△ 実際に書いたらできる
15→❌ 考え方がわからなかった
16→❌ シンプルに難しい
17〜20 セキュリティの知識をつける
考え方の解説ありがたすぎる!サンプルと参考書の少量の問題しかやっていなくて不安なのですが、他にどのような勉強をしておくべきでしょうか?学校で午前免除を受け合格済みです。午後だけのアドバイスをお願いします!!!
ご質問ありがとうございます。
午後問題、とにかく問題の量をこなすことが大事です。
既にサンプル問題を解いている状態なら、
他の問題にチャレンジするのが望ましいです。
また問題の解説を見て復習する際に、ただ単に「理解した」ではなく
「同類の問題を次に解くとしたら解ける」というレベルまで復習することが重要です。
3月下旬にはなってしまいますが、
IPA公式のサンプル問題の類似問題の解説動画を追加でアップ予定ですので、
受験までに間に合えばそちらもご利用ください。
基本情報技術者の勉強頑張ってください!
ためになる動画をありがとうございます。
問3について、質問させてください。
9:04 辺りのoutの要素数が配列の末尾の値になる理由が理解できておりません。要素数=その中にある値の数(何個の値が入っているのか)ことだと理解していたのですが、要素数=配列の末尾の値というものなのでしょうか?
質問ありがとうございます。以下に回答しますね。
ご質問は動画内8:57付近の「out[outの要素数]というのは配列の中の一番末尾の値をとってくるという風に言い換えられる」と言っている部分を指されていると思います。
具体例で考えるとわかりやすいです。下記、iの値ごとに tail ← out[outの要素数] が実行されるタイミングにおいて、
・i=2の場合、out={3}、outの要素数=1、out[outの要素数]=out[1]=3
・i=3の場合、out={3,5}、outの要素数=2、out[outの要素数]=out[2]=5
・i=4の場合、out={3,5,6}、outの要素数=3、out[outの要素数]=out[3]=6
となっています。全てのケースでout[outの要素数]が配列outの末尾の値になっていることが見て取れると思います。
なのでご質問いただいている「outの要素数が配列の末尾の値になる」のではなく、
「out[outの要素数]が配列の末尾の値になる」ということを説明しております。
動画内での説明が混乱させてしまう形となっておりすみません。
ご不明点などありましたらご連絡ください。
@@itgakko
ご回答いただき、ありがとうございます。
返信遅くなり、申し訳ないです。
詳しい説明のおかげで、out[outの要素数]が配列の末尾の値になる、という意味が理解できました。
ありがとうございます!
今後もこの動画を活用させていただきます!
先生!何とか受かりました!✨
科目A 725点、B 610点…ギリッギリでした😂
どちらも見たことない問題のオンパレードで半分以上がそんなのだったんでAからすでに心が折れそうでした😢でも受かって良かった🎶先生の対策のおかげです!ありがとうございました!!
合格おめでとうございます!!
過去問道場とかの感覚や、先生の対策やった感覚ではどっちも800点は出るだろうと思ってて『合格は当たり前として、いかに高得点で受かろうか』って調子乗ってたら難しすぎて一気に現実を突きつけられました😂
前回合格率高かったからきっとIPAが難しくしたんだー(´;ω;`)
では次のIT資格の勉強に移ります!
後日、今回の試験の問題が発表されて、先生が解法動画アップしてくださったら確認しに来ます(笑)
次の資格の勉強頑張って下さい!
試験の問題は毎回ランダムなこともあり、今回受験された問題が公開される可能性は薄いですね。
@@itgakko あらー、そうなんですねー(´・ω・`)もし応用情報受けるときには、いつか先生が対策してくれるかも知れませんので、またお世話になるかも知れません😏(仮定の仮定の仮定w)
解説ありがとうございます。問8の二分木の問題で、処理の手順について質問があります。
if (tree[n]の要素数 が 2 と等しい)
order(tree[n][1]) ・・・処理①
n を出力 ・・・処理②
order(tree[n][2]) ・・・処理③
とありますが、IFの条件を満たしたら処理①を行い、次に処理②に行かないでまたIFの条件を満たすか確認して処理①にいくのがわかりませんでした。
質問ありがとうございます!
order(1)と呼び出された場合の処理順について以下に説明しますね。
-----
◯order(整数型: n)
1. if (tree[n]の要素数 が 2 と等しい)
2. order(tree[n][1])
3. n を出力
4. order(tree[n][2])
5. elseif (tree[n]の要素数 が 1 と等しい)
6. order(tree[n][1])
7. n を出力
8. else
9. n を出力
10. endif
-----
まずorder(1)と呼び出されると、
1行目でif文の条件式が実行されます。
tree[1] = {2, 3} で要素数が2なのでif文内の処理が実行されます。
次に2行目の「order(tree[n][1])」が実行されます。
これは関数orderの呼び出しです。
関数内で関数が呼び出された場合、実行中の関数(ここではorder(1)として呼び出された関数)は中断されて、
新たに呼び出した関数が実行されます。
tree[1][1] = 2 なので、order(2)が新たに実行されます。
中断したorder(1)はorder(2)の処理が終了したら再開されます。
order(2)が呼び出されるとまた先頭から実行されます。
1行目のif文の条件式が実行され、
tree[2] = {4, 5} で要素数が2なのでif文内の処理が実行されます。
このような処理順で続いていきます。
そのためおっしゃっている「IFの条件を満たしたら処理①を行い、次に処理②に行かないでまたIFの条件を満たすか確認して処理①にいく」順番で処理されます。
以上、ご不明点ございましたらご連絡いただければと思います。
すみません再度質問失礼します。
問16に関してなのですがcpというのはこの場合何を指しているのでしょうか?数値としては無いのでしょうか?
またこの場合の具体的な結果の数値はどのようになりますでしょうか?初学者で不明点多くて申し訳ありません。よろしくお願いします。
また本文中では2進数のビットパターンで記載されていて、プログラム上では10進数での記載がされているためプログラム上の値を2進数に変換してしてしまったのですが、この場合は10進数のまま進めていくのでしょうか?
加えてこの配列に格納されている3つの値はそれぞれ別物で考えるのか一つのものとして考えるのかどちらでしょうか?
何度も申し訳ありません。答えていただければ幸いです。よろしくお願いします。
質問ありがとうございます!いかにそれぞれ回答しますね。
・cpというのはこの場合何を指しているのでしょうか?数値としては無いのでしょうか?
→変数cpはプログラム上以下2つの値を格納しています。
cpに対して割り算した結果をさらにcpに格納しているので、
何か1つのものを指してはおらず、役割が変わっていっているイメージです。
・引数で渡された Unicode の符号位置
・引数で渡された Unicode の符号位置について、
ビットパターン(配列utf8bytesに格納されている値)で割った商
・この場合の具体的な結果の数値はどのようになりますでしょうか?
→問題の具体例にある”あ”の符号位置 3042(16進数表記) が
本プログラムの引数に渡された場合を例に説明しますね。
以下プログラムの動きです。「//_斜体_」で具体値など補足しています。
最終的にプログラムから返される値(10進数表記)が{227, 129, 130}となります。
これを2進数表記に直すと{11100011, 10000001, 10000010}となり、
問題文に記載してある"あ"のutf-8の記号に一致します。
--------------------
整数型の配列: utf8bytes ← {224, 128, 128}
整数型: cp ← codePoint _// cp = 12354(16進数表記3042 を 10進数表記に直した形)_
整数型: i
for (i を utf8bytes の要素数 から 1 まで 1ずつ減らす) _// i=3 から i=1 の3回繰り返す_
・繰り返し1回目(i=3)
utf8bytes[i] ← utf8bytes[i] + (cp ÷ 64 の余り)
_// 12354 ÷ 64 の余り = 2 なので、_
_// utf8bytes[3] = 128 + 2 = 130 となる_
cp ← cp ÷ 64 の商
_// cp ÷ 64 の商 = 193 なので、_
_// cp = 193 となり、次の繰り返しへ_
・繰り返し2回目(i=2)
utf8bytes[i] ← utf8bytes[i] + (cp ÷ 64 の余り)
_// 193 ÷ 64 の余り = 1 なので、_
_// utf8bytes[2] = 128 + 1 = 129 となる_
cp ← cp ÷ 64 の商
_// cp ÷ 64 の商 = 3 なので、_
_// cp = 3 となり、次の繰り返しへ_
・繰り返し3回目(i=1)
utf8bytes[i] ← utf8bytes[i] + (cp ÷ 64 の余り)
_// 3 ÷ 64 の余り = 3 なので、_
_// utf8bytes[1] = 224 + 3 = 227 となる_
cp ← cp ÷ 64 の商
_// cp ÷ 64 の商 = 0 なので、_
_// cp = 0 となり、繰り返し終了_
endfor
return utf8bytes _// utf8bytes = {227, 129, 130}_
--------------------
・本文中では2進数のビットパターンで記載されていて、
プログラム上では10進数での記載がされているため
プログラム上の値を2進数に変換してしてしまったのですが
この場合は10進数のまま進めていくのでしょうか
→問題を解く上では 2進数 or 16進数 どちらで考えてもOKです。
・加えてこの配列に格納されている3つの値は
それぞれ別物で考えるのか一つのものとして考えるのかどちらでしょうか?
→すみません、こちらの質問の意図を読み取ることができませんでした。
具体的に考える上で困った理由、箇所などを教えていただけないでしょうか。
あと2週間も無いくらいで科目B試験あります😭
毎回20問中5問しか正解しません💦残りわずか動画活用させていただきます!!
勉強頑張って下さい!
問9ですが、order(2)の後nを出力して、order([n],[2])をしてから、order(tree[n][1])をするのではないのでしょうか?if文3行の処理をせず、処理1をする点がちょっと理解できずにいます。
質問ありがとうございます。
結論としては、動画内で解説している順序が正しいです。
再帰呼び出しの場合の処理順についてですが、
下記でより詳しく解説していますので、こちらの問14を確認してみてください。
【初心者向け】基本情報技術者試験 科目B|アルゴリズムをゼロから理解する
czcams.com/video/waAwVXa9y2o/video.html
ありがとうございます。やってみます!
今更な質問だと思いますが、
問14のi=2のとき、2.25が3になっているのは、
「小数点以下を切り上げる」とは四捨五入とは違って、小数点以下に数値があれば繰り上げるということでしょうか?
四捨五入してしまったため、2.25を2として計算してしまい答えが間違っていました。
質問ありがとうございます!
記載頂いた通り「小数点以下を切り上げる」とは小数点以下に数値があれば(=.000... でなければ)繰り上げるという認識で大丈夫です。
今回、午前免除等でなく午前と午後のフルタイムの受験です。午前は余裕で基準をクリアできましたけど、やはり、午後が難しい。前回はあと一歩のところで、不合格。今回は話しにならない点数。皆さんが言うように、午後対策に特化した講義です。しかしながら、人により、問題との相性がピッタリはまらないと、初見のオンパレードで地獄を見ます。見たことがあると、感じられるならば、感触どうりに得点できるだろうけど、運がなかったのかな。
コメントがありがとうございます!
見たことがあると感じられる問題が出てくるのは期待できません。見たことがある問題が出てきたらラッキーくらいに考えた方が良いです。
問5の√pow(x,2)+pow(y,2)のルートを外した際にpow(pow(x,2)+pow(y,2),0.5)の部分で正の平方根の値は2分の1乗の計算結果と等しいについて動画内の説明で理解ができなかったです。
powが1つ増えて0.5の値が出てきている過程を可能な限りもう少し解説いただきたいです。
質問ありがとうございます!
正の平方根の値 が 2分の1乗の計算結果と等しくなることについては、外部サイトですが以下にわかりやすい説明があったので見ていただければと思います。
kentiku-kouzou.jp/suugaku-2bunno1jou.html
※2分の1乗の計算については、基本情報技術者試験の範囲というより、高校数学の範囲なので動画内では説明しておりません。ご承知下さい。
@@itgakko
ご回答ありがとうございます。
結論は理解しましたが、数学が苦手なため原理原則まで理解できませんでした。
基本情報対策とは別で数学の勉強もしないといけないなと感じますね。
勉強頑張って下さい!
問9の質問です。tree[n]の要素数が2と等しいの条件で最初に{2,3}となり2と等しいはず(私の理解不足だったらすいません)なのに、8になるまで出力せずにn=1,2,4,8と処理を実行するのはなぜですか。
質問ありがとうございます!
まず記載頂いている内容の前半の
「tree[n]の要素数が2と等しいの条件で最初に{2,3}となり2と等しいはず」
こちらは合っています。
おそらく再帰呼び出しの処理順について理解が不十分だと思います。
再帰呼び出しについて以下の動画で詳しく解説していますので
よければまずこちらをご覧ください。
✅【初心者向け】基本情報技術者試験 科目B|アルゴリズムをゼロから理解する(問14が再帰呼び出しの問題です)
czcams.com/video/waAwVXa9y2o/video.html
48:04 最初問題を解いているとき、問13(ア)でelseのreturn middleが実行されたあと、while文頭に戻って更にlow
質問ありがとうございます!
そうですね、return が実行されると問答無用でその関数の実行が終了します。
大変有用な解説動画をありがとうございます。
問16について質問があります。cpを64で割って余った数が後ろの64ビットになるという部分ですが、なぜこのようになるのでしょうか?説明が難しければ、理解するうえで抑えておくべき単元の内容をご教授いただけますと幸いです。よろしくお願いします。
質問ありがとうございます。回答します。
まず、2進数で話をする前に、10進数の場合で考えてみましょう。
例として、以下の「xxxxxx」の部分に
10進数「333,222,222,111,111」を右詰めで格納する時の処理を考えます。
対象:33xxxxxx 22xxxxxx 11xxxxxx
まず結果だけ見ると、
33000333 22222222 11111111 になりますよね。
これをプログラムで表現するために
計算上どうやっているかを考えます。以下の通りです。
①11xxxxxx の部分を穴埋め
「333,222,222,111,111」の"右側6桁を取得"
この右側6桁を取得するという計算を具体的な計算式で書くと
「333,222,222,111,111」を1,000,000 で割った余り になります
※333,222,222,111,111 ÷ 1,000,000 = 333,222,222、余り111,111
なぜこのようになるかというと、1,000,000で割るというのは、
小数点を6桁右にずらすと同義で、小数点以下にずれた6桁が余りになるからです
また、1,000,000 で割った商、「333,222,222」
つまり小数点を6桁右にずらした結果の小数点より左側の値を
次の②で使用します
②22xxxxxx の部分を穴埋め
「333,222,222」の"右側6桁を取得"
つまり「333,222,222」を1,000,000 で割った余り を取得
また、1,000,000 で割った商、「333」
つまり小数点を6桁右にずらした結果の小数点より左側の値を次の③で使用します
③33xxxxxx の部分を穴埋め
「333」の"右側6桁を取得"
つまり「333」を1,000,000 で割った余り を取得
問16の内容を全ての値が10進数として扱うと
上記のような計算を行うことで結果を得ることができます
ここでポイントなのは、10進数でいう6桁分の値を抽出するには、
1,000,000で割る = 小数点を6桁右にずらす
(10の6乗で割る)
という処理が必要だということです
問16の内容に戻って、2進数で考えるとき
「小数点を6桁右にずらす」には何をすればよいでしょうか。
これが2進数だと「64で割る」という計算になります。
もっとポイントを押さえた形で書くと、「2の6乗で割る」ということになります。
2進数と10進数の違いは1桁あたりで表現できる数字の数になります。
・2進数の1桁で表現できる数字の数は0と1の2パターン、
・10進数の場合は0,1,2,3,4,5,6,7,8,9の10パターン、
その為「小数点をn桁右側にずらす」ためには、
それぞれ上記のパターン数のn乗で割った余りを求める必要があります。
・2進数の場合:2のn乗で割る
・10進数の場合:10のn乗で割る
ご不明点ありましたらご連絡ください。
@@itgakko 無事理解できました。基礎の基礎からかみ砕いて説明してくださり大変助かりました。ありがとうございました!
よかったです。
基本情報技術者試験の勉強頑張ってください!
コメント失礼します
この20問の対策のみでは、本試験に対応するのにはさすがに不十分ですよね??
質問ありがとうございます!
十分かどうかは人によって変わるのでなんとも言えませんが、
この20問がすらすら解けないのであれば、
その他の問題も解いて練習するのがいいと思います!
さいとうさんのおかげで合格することができました!
お世話になりました!
合格おめでとうございます!
いつもさいとうさんの動画にはとてもお世話になっております。
問16の文字コードの問題につきまして、質問があります。
処理の内容は把握できたのですが、
6桁を取得するための計算で、なぜ64で割るのかが理解できずにいます。
6桁なので32だと思っているのですが…
質問ありがとうございます!
なぜ6桁だと64で割るのかについて、
1桁の場合から1つずつ桁を増やして考えるとわかりやすいです。
・1桁: 0 or 1 の2つしかないので、2パターン
・2桁:1桁の時の各パターンに対して、1番左に 0 or 1 がつくパターンが増えるので、 2 × 2 = 4パターン
・3桁:2桁の時の各パターンに対して、1番左に 0 or 1 がつくパターンが増えるので、 4 × 2 = 8パターン
・4桁:3桁の時の各パターンに対して、1番左に 0 or 1 がつくパターンが増えるので、 8 × 2 = 16パターン
・5桁:4桁の時の各パターンに対して、1番左に 0 or 1 がつくパターンが増えるので、 16 × 2 = 32パターン
・6桁:5桁の時の各パターンに対して、1番左に 0 or 1 がつくパターンが増えるので、 32 × 2 = 64パターン
また、動画概要欄にも「なぜ64で割った余りが後ろの64パターン(6ビット分)になるのか」という説明を
補足として記載していますのでよろしければそちらもご確認ください。
解説が流れる様に早くて、理解しながら付いて行くのは大変でした、、
コメントありがとうございます!
40:53 の問10について、質問です。
ここで例として説明していただいているときに用いられている「あ、い、う、え、お」からなる単方向リストを、配列っぽく{'あ','い','う','え','お'}と表したとして、
ここでの例と同様にこの配列{'あ','い','う','え','お'}から「え」を問題文のプログラムを用いて、削除するとしたら、{'あ','い','う','お','お'}のような感じになると思ったのですが、この理解はあっていますでしょうか?
また、もしこの理解があっていた場合、問題文のプログラムを実行した、入出力を配列っぽく表すと、{'あ','い','う','え','お'}→{'あ','い','う','お','お'}のようにはなるけど、単方向リストの性質的には指定された要素が削除されたことになっているのでしょうか?それとも、そもそもこのように配列っぽく考えるのではなく単に、「う」から「え」へのつながりが、「う」から「お」へのつながりに変えられて、結果的に要素「え」が削除された、といった風に考えたほうが良いのでしょうか?
長文になってしまいましたが、よろしくお願いいたします。
質問ありがとうございます!
問題文のプログラムを使用して 単方向リスト {"あ","い","う","え","お"} から "え" を 削除すると、結果は {"あ","い","う","お"} になります。
おそらくイメージされている内容はあっていると思いますが、細かいところが異なるので以下で説明しますね。
混乱させてしまったかもしれませんが、単方向リストは配列の一種だと考えてください。
まず通常の配列と、今回の問題の題材である単方向リストの特徴を記載しますね。
【通常の配列】
各要素へのアクセスは配列の各要素と対応する「添え字」によって行う。
(例)
{"あ","い","う","え","お"} から 4番目の要素 "え" を取得する場合、
プログラム上では 配列名[4] のように、添え字を使ってアクセスする。
【単方向リスト】
各要素へのアクセスは、各要素が持つ「次の要素へのリンク」を用いて先頭から芋蔓式に行う。
(例)
{"あ","い","う","え","お"} から 4番目の要素 "え" を取得する場合、以下の順番でアクセスする。
1. 先頭の要素 "あ" を取得
2. "あ"が持つ次の要素へのリンクから "い" を取得
3. "い"が持つ次の要素へのリンクから "う" を取得
4. "う"が持つ次の要素へのリンクから "え" を取得
どちらも、複数の要素の集まり(例.{"あ","い","う","え","お"}) を表していることに変わりはありませんが、要素へアクセスする際の方法が異なります。
上記を踏まえた上で、{"あ","い","う","え","お"} から "え" を 削除した時どうなるかを説明します。
単方向リストの特徴を踏まえた上で削除前、削除後の状態を書くと以下のようになります。矢印は次の要素へのリンクを表します。
【削除前】
"あ" →→→ "い" →→→ "う" →→→ "え" →→→ "お"
【削除後】
"あ" →→→ "い" →→→ "う" "え" "お"
└────────↑
この削除後の状態では、元々あった要素 "え" は単方向リストにおいて要素を取得する際の特徴(先頭からリンクを使って芋蔓式にアクセス)に当てはめると、どうやってもアクセスできない状態になりました。
こういった状態を指して「"え"が削除された」ということになります。
おそらくイメージされている内容はあっていると思いますが、そもそも単方向リストは配列(複数の要素の集まり)の一種であるので、この削除後の状態を {} で書き表すと {"あ","い","う","お"} になります。
以上、ご不明点ありましたらご連絡いただければと思います。
丁寧に説明していただき、ありがとうございます。
単方向リストは配列の一種なんですね。
重ねて質問してしまって申し訳ありませんが、削除後の単方向リストを配列であらわすと{"あ","い","う","お"}となるとすると、配列の要素番号の先頭の値をを0とすると、この配列の要素「お」の要素番号は、削除前と削除後で4から3に変わったと考えてよいのでしょうか?
また、仮にもともとの単方向リストが「あ、い、う、え、お、か、き、く、け、こ」であった場合にこの単方向リストから「え」を削除するときを考えた場合も同様に、
削除前、削除後の単方向リストを配列であらわすと
{"あ","い","う","え","お","か","き","く","け","こ"}
→{"あ","い","う","お","か","き","く","け","こ"}
となり、要素「お」、「か」、「き」、「く」、「け」、「こ」の要素番号もそれぞれ1ずつ減ると考えてよいのでしょうか?
よろしくお願いいたします。
@@itgakko
追加で頂いた質問に回答しますね。
単方向リストではそもそも「要素番号」は存在しません。
要素番号が存在しない代わりに各要素が「次の要素へのリンク」を持っていて、これを使って各要素にアクセスします。
なので単方向リストではそもそも要素番号が増えたり減ったりするという考え方自体がありません。
各要素が持つ「次の要素へのリンク」を変更することによって要素の追加だったり削除を表現します。
ありがとうございます!40:53 のおかげで、リスト構造の使い方の理解が深まった気がします。丁寧に教えていただき、ありがとうございました!@@itgakko
よかったです!
ほぼこの動画でしか科目Bの対策しませんでしたが、なんとか合格できました。的確で分かりやすい説明を80分の動画にまとめてください大変ありがとうございました。
合格おめでとうございます!!
質問です
問9の二分木で処理①、処理②、処理③がそれぞれ問題文記載のプログラムのどのコード部分を仰っているのでしょうか。
ご回答お願いします
質問ありがとうございます。
問9の処理①②③について、以下の通りとなります。
①order(tree[n][1])
②nを出力
③order(tree[n][2])
上記がわかりづらくすみません。
ご不明点などあればご連絡頂ければと思います。
30日に受けるのですが、サンプル問題の正答数は16/20でした。
公開問題を見た感じ、サンプル問題よりも全然難易度が高い問題が予想されますが、どうなんだろ笑
試験本番ではランダムに出題されるので確実な内容は分かりませんが、
サンプル問題よりも難易度が高い問題が出たというお話もよく聞きますので、
レベルの高い問題も練習した方が良いと思います!
科目Bは、さいとうさんの動画を全てみて理解すれば解けるようになるのでしょうか?
他にやるべき問題、参考書などはありますか?
科目Bは過去問がないのでいけるか不安です。
質問ありがとうございます!
「理解した」のハードルが人によって違うので、
基本的に「〜〜やれば解けますか?」のような質問にはお答えしておりません。
ご了承ください。
人によって前提となる知識が異なるので
どの程度の量問題を解けば良いという目安はありません。
ご自身の感覚で「8割程度正解できる」という自信がつくまで学習するのが良いです。
私の動画だけで自信がつくならそれで良いですし、
足りないなら問題集でさらなる自信アップをする必要があります。
問題集であれば以下の問題集はオリジナル問題が77問掲載されていておすすめです!
基本情報技術者[科目B]アルゴリズムとプログラミング トレーニング問題集
【質問(問9)】
→「8」出力後に「4」が出力される理由が分かりません
【質問詳細】
「8」出力後に3行目の処理、
order(tree[n][1])
に再帰しているにも関わらず、それを無視して4行目の処理、
nを出力
に移行してるのは何故ですか?
質問ありがとうございます!
結論から言うとorder(8)として関数が呼び出された際、
3行目の処理「order(tree[n][1])」は実行されません。
-----
1. ◯order(整数型: n)
2. if (tree[n]の要素数 が 2 と等しい)
3. order(tree[n][1])
4. nを出力
5. order(tree[n][2])
6. elseif (tree[n]の要素数 が 1 と等しい)
7. order(tree[n][1])
8. nを出力
9. else
10. nを出力
11. endif
-----
order(8)として関数が呼び出された場合、
tree[n]の要素数は0です。
そのため、10行目の「nを出力」だけ実行されてorder(8)として呼び出された関数は終了します。
以上、ご不明点ございましたらご連絡頂ければと思います。
返信ありがとうございます。
しかしながら、説明してくださっているのは、不明点の1つ前の処理です。
疑問点は下記の通りです。
order(8)が
nを出力
して、処理終了となるのは分かります。
困惑しているのはその後のorder(4)に再帰後の処理です。
order(4)に再帰後になぜそのまま
nを出力
となり、「4」を出力しているのですか?
なぜ、3行目の
order([][1])
を無視しているのですか?
失礼しました。
ご認識されているプログラムの処理順が誤っているので、
プログラムの処理順を説明しますね。
-----
1. ◯order(整数型: n)
2. if (tree[n]の要素数 が 2 と等しい)
3. order(tree[n][1])
4. nを出力
5. order(tree[n][2])
6. elseif (tree[n]の要素数 が 1 と等しい)
7. order(tree[n][1])
8. nを出力
9. else
10. nを出力
11. endif
-----
まずorder(4)として呼び出されると、
3行目:order(tree[n][1]) が実行されます。
これは関数order(8)として呼び出すことを指します。
もう少し詳しくいうとorder(4)を中断してorder(8)を実行するイメージです。
order(8)は「8を出力」だけ実行して終了します。
ここで中断していたorder(4)を再開します。
order(4)は3行目まで実行していたので、
4行目の「nを出力」から再開します。
このような処理順になっています。
以上、ご不明点ございましたらご連絡頂ければと思います。
@@itgakko
中断された行(処理)の次の行(処理)から始まるということなんですね…
本問題について理解できました。
ありがとうございます。
@user-lw4hn3pn2h よかったです!
自信があったのに500点で落ちてしまいました。
問題の難易度としても、11問は理解できていると思いながら解きましたが時間が足りなくて見直しを行いませんでした。
自分としては次の学習として何をするべきなのかわかりません。
まずは試験お疲れ様でした!
仮に11問全て正解していたとしても不合格の可能性が高いので、
もっと問題演習をして実力アップ&解くスピードアップしていくのが良いですね!
すみません質問です。
問9のようなtree[n][2]はtree[n+2]という認識であっていますでしょうか?
お返事お待ちしております。
質問ありがとうございます。
tree[n][2] の意味は tree[n+2] ではなく、
「2次元配列 tree の n番目の配列の 2番目の値」という意味になります。
2次元配列は、配列の要素が配列になっているもののことです。問9で与えられている2次元配列 tree で説明しますね。
tree = {
{2,3} ・・・tree[1]
,{4,5} ・・・tree[2]
,{6,7} ・・・tree[3]
,{8,9} ・・・tree[4]
,{10,11} ・・・tree[5]
,{12,13} ・・・tree[6]
,{14} ・・・tree[7]
,{} ・・・tree[8]
,{} ・・・tree[9]
,{} ・・・tree[10]
,{} ・・・tree[11]
,{} ・・・tree[12]
,{} ・・・tree[13]
,{} ・・・tree[14]
}
2次元配列は、配列の要素1つ1つが配列となっているので、例えば上記の1要素の「tree[1]」これ自体が配列となります。
例えば普通の配列 array の2番目の値を取得する場合は、array[2] と書くと思います。
2次元配列 tree の場合では、「tree[1]」自体が配列なので、「tree の 1番目の配列 から 2番目の値を取得する」という意味合いで tree[1][2] という記述を使用します。この記述で配列 tree[1] の 2番目である「3」が取得できます。
何かご不明点ありましたらご連絡ください。
お返事ありがとうございます。おかげで概要を理解することができました🙇
よかったです。
基本情報の勉強頑張ってください!
問6は、丁寧にトレースすると正解がアなので、イウエをトレースしなくても速い時間で答えが出ます。もし本番でこのような問題がでて、答えがウエらへんだと時間が足りなさすぎる気がするのですが、やはり、この場合は地道にトレースして、トレースする時間をはやくする練習をした方がいいのでしょうか??
質問ありがとうございます!
本番を考えると、まず大前提として時間がかかりそうな問題に出会った場合、制限時間の関係から後回しにするのが良いです。
その上で問6レベルの問題であれば、全て地道にトレースしなくても答えが出せるようになるくらいの実力をつけてから試験に臨むのが望ましいです。
純粋にトレースの速度を上げることと、トレースに慣れて端折るスキルを身につけましょう。1行1行トレースするのではなく、for文であれば繰り返し処理の最初の方だけトレースしてみてプログラムの全体像を掴むことだったりといったことです。
問3、なんでoutの要素数は末尾になるんですか?
回答させて頂きます。
ご質問は動画内8:57付近の「out[outの要素数]というのは配列の中の一番末尾の値をとってくるという風に言い換えられる」と言っている部分を指されていると思います。
具体例で考えるとわかりやすいです。下記、iの値ごとに tail ← out[outの要素数] が実行されるタイミングにおいて、
・i=2の場合、out={3}、outの要素数=1、out[outの要素数]=out[1]=3
・i=3の場合、out={3,5}、outの要素数=2、out[outの要素数]=out[2]=5
・i=4の場合、out={3,5,6}、outの要素数=3、out[outの要素数]=out[3]=6
となっています。全てのケースでout[outの要素数]が配列outの末尾の値になっていることが見て取れると思います。
ご不明点などありましたらご連絡ください🤗
@@itgakko ありがとうございます!めちゃくちゃ助かりました!!
ありがとうございます。初学者なので大変助かります。問13で、選択肢 エ)も無限ループになってしまいます、、、どこかを勘違いしているのですが、もしお時間あれば教えてください。例えば、data [-1, 1], target 1 ではどうなるか教えていただけるとありがたいです。
ご質問ありがとうございます。
まず、記載頂いた data=[-1,1]、target=1 のケースですと、「(ウ)要素数が2で、target が dataの末尾要素の値と等しい」ケースにも当てはまってしまい、無限ループとなってしまいます。
ですので、記載頂いたケースとは別に、「(エ)要素に -1 が含まれている」ケースで無限ループにならない例を記載します。data=[-1, 2, 3], target=2 です。以下プログラムと各行の実行結果です。実行結果を 「_//斜体のコメント_」で記載しています。
----------
low ← 1
high ← dataの要素数
_//high = 3_
while (low target)
_// elseif (2 > 2) = false(偽) なので elseまでスキップ_
else
return middle
_// return 2 となり、targetと同じ値が格納されている要素番号が返されるので無限ループしない。_
----------
ただ、この問題の少し複雑な箇所として、「(ウ)要素数が2で、target が dataの末尾要素の値と等しい」が無限ループとなる唯一の条件ではない(十分条件ではあるが必要十分条件ではない)と言う点です。
※なので、問題文の中に「例えば...」という記載があるようです。
例えば(ウ)には合致しませんが、以下のケースは無限ループします。
data=[-1, 2, 3], target=4
----------
low ← 1
high ← dataの要素数
_//high = 3_
while (low
@@itgakko ご丁寧にありがとうございます。恐れ入ります。やっとスッキリしました。問題(選択肢)に若干クセがあるような気もしますが、学習を続けていくうちにさらに理解できるかもしれません。この動画のおかげで科目Bに取り組めています。合格に向けて頑張れそうです。
@@ffffrrrreeeeeeee
ご返信ありがとうございます!
おっしゃる通り他の問題と少し毛色が違うかもしれませんね。
「試験の制限時間内に解く」という意味では全問正解を目指すより優先度をつけて解ける問題から解くということも大事になると思います。このタイプの問題は時間がかかりそうなので試験では後回しでもいいかもしれません。
どの問題から解くか、を動画化するのも検討してみますね。
基本情報技術者試験の勉強頑張ってください🤗
解説ありがとうございます、、心強いです。残り4日しかありませんが気合い出します。質問です。
36:01 n=8を出力した後、なぜ一つ前の4に戻るかがよく分かりません、、
8が格納されている節の親が4だからですね、、
初歩的ミスでした😅
解いても模試で30%しか解けません。解説を読めばわかるのに本番になるとアルゴリズムが読めなくなります。基本がまだなってないのでしょうか😅
質問ありがとうございます。
記載いただいた内容を確認しました。
「解説を読めばわかる」と「問題が解ける」は別物です。
記載いただいている通り基礎が足りないということもあると思いますが、
問題を解いて解説を見る際、「同様の問題が来たらどう解くか」というところまで
復習をしていくことが一番大事だと思います。
問9について何人かの方が質問されておりその内容も見た上で再度教えていただきたいのですが、最初の「8を出力」は、解説内の表の処理②ではなく、order(8)で呼んだ時の、else内の「nを出力」処理だと思うのですが、処理②のセル内に「8を出力」と記載したのには何か理由がありますでしょうか?解説内の表の処理②はif文中の「nを出力」を示していると動画内で説明があったためです。なのであくまで表内の処理②の4行目セルは「なし」と記載されるのが正しいのではないかと考えました。細かい部分で申し訳ないですが見ていただけますと幸いです。
質問ありがとうございます。
頂いた内容、動画内での説明が不足しており申し訳ないです。
処理①〜③は以下の通りとして表に値をトレースしています。
if (tree[n]の要素数 が 2 と等しい)
order(tree[n][1]) _・・・処理①_
n を出力 _・・・処理②_
order(tree[n][2]) _・・・処理③_
elseif (tree[n]の要素数 が 1 と等しい)
order(tree[n][1]) _・・・処理①_
n を出力 _・・・処理②_
else
n を出力 _・・・処理②_
endif
お手数ですが上記として読み替えて進めて頂ければ幸いです。
今さっき受験してきました!
科目A 725/1,000
科目B 745/1,000
科目Bの方が苦手だったのに……!
このチャンネル3日間くらい見てたおかげです。本当にありがとうございました!
素晴らしいですね!
合格おめでとうございます!
いつもお世話になっております!
ご質問がありまして、トレースの際は、実行結果を書くと さいとうさんから学びました。そこで、難易度が高くなったら実行結果の正しい表が作れません。表の順番の作り方をご教示頂きたいです。よろしくお願い致します!
質問ありがとうございます!
トレースする際はとにかく1行1行トレースすることが大事です。
最初の方は時間がかかるかもしれませんが、
1行1行しっかりとトレースすれば確実に正しい結果が出ます。
慣れるまでは時間がかかっても1行1行飛ばさずにトレースし、
慣れてきたら一部スキップしたりしてスピードを上げていくのが良いですね。
承知しました!
勉強になります。ありがとうございます
@@user-nu7wj3ed3c 勉強頑張ってください!
問14の問題で
プログラムのところでi の中身を最初に格納しているのに実際解いていく時にfor文の所のi はなぜ1からスタートなのでしょうか。
また、findrankの計算の時のi でなぜプログラムで格納したi をこのタイミングで使うという考えが出てくるのでしょうか🥹
躓いてしまい先に進めません、、、
質問ありがとうございます!それぞれ回答しますね。
・プログラムのところでi の中身を最初に格納しているのに実際解いていく時にfor文の所のi はなぜ1からスタートなのでしょうか。
→ for文のことをおっしゃっているのでおそらく 関数summarize 内の処理を指していると思います。
まず、関数summarize では i の値を最初に格納しておりません。
ただ「i がなぜ 1からスタートなのか」については、
「科目Bアルゴリズムの擬似言語では、配列の要素番号が1から始まるから」です。
for文の中で p[i] のように配列の要素に対してアクセスする処理があり、
配列の要素番号は1から始まるので、for文の記載として i を1から始めています。
・findrankの計算の時のi でなぜプログラムで格納したi をこのタイミングで使うという考えが出てくるのでしょうか🥹
→ すみません、こちらの理解が及ばなかったのですが、以下のことを指していますでしょうか?
-----
◯実数型: findRank(実数型の配列: sortedData, 実数型: p)
整数型: i
i ← ( p × (sortedDataの要素数 - 1)) の小数点以下を切り上げた値 _// プログラムで格納したi_
return sortedData[i + 1] _// このタイミングで使う_
-----
なぜかと言うと「プログラムがそうなっているから」以外答えようがありません。
※問題の作成者であれば分かるとは思うのですが...
この問題は、プログラムの実行結果を問う問題なので、
質問頂いた内容を知らなくても答えを導き出せますので、
あまり気にしなくても良いとは思います。
以上、ご不明点ありましたらご連絡いただければと思います。
質問失礼致します。
問1.変数ですが、最後に「z←x」を行った場合、最終的にzに入る値は1かと思っておりましたが、なぜ2になるのでしょうか?
「x←y」「y←z」の時は、そのまま数字が代入されていきましたが、「z←x」のみ単純な代入ではないのでしょうか…
質問ありがとうございます。
問1について、変数x の値にのみ注目したプログラムの動きは以下の通りになります。
※ xの値は「//斜体」の形で記載しております。
----------
整数型: x ← 1 _// x = 1_
整数型: y ← 2 _// x = 1_
整数型: z ← 3 _// x = 1_
x ← y _// x = 2_
y ← z _// x = 2_
z ← x _// x = 2_
----------
プログラムの最後でzにxを代入する際は、xの値が2に変わっていますので、zの値は2になります。
ご不明点ありましたらご連絡ください。
@@itgakko 回答ありがとうございます!すでに4行目でxの値が変わっていたということですね…!
助かりました!ありがとうございます!
@@user-gc9pr7ez1b
基本情報技術者試験の勉強頑張ってください🤗
問9でn=8出した後else後のnを出力ではなくif内でのnで8を出力していると考えています。
その後再起呼び出し終わりでn=4となりelse後のnを出力で4が出力されると思っているのですが間違えていますか?
n=8の後どういう流れで出力しているのか知りたいです
質問ありがとうございます!
まず頂いた以下の内容は間違っています。
----------
問9でn=8出した後else後のnを出力ではなくif内でのnで8を出力していると考えています。
その後再起呼び出し終わりでn=4となりelse後のnを出力で4が出力されると思っているのですが間違えていますか?
----------
関数order を n=4 として呼び出した後の流れを以下に説明します。
実行される行のみに絞ってプログラムの流れを記載しています。
----------
・order(n) _// n=4 で呼び出し
if (tree[n] の 要素数 が 2 と等しい) _// tree[4] = {8,9} で要素数2 のため if内の処理を実行_
order(tree[n][1]) _// tree[4][1] = 8 なので order(8) として関数を呼び出す_
_※別の関数が呼び出されたため、一旦 order(4) の処理は中断_
・order(n) _// n=8 で呼び出し_
if (tree[n] の 要素数 が 2 と等しい) _// tree[8] = {} で要素数0 のため elseif へ移動_
elseif (tree[n] の 要素数 が 1 と等しい) _// tree[8] = {} で要素数0 のため else へ移動_
else
n を出力 _// 8 を出力_
_※この時点で order(8) の処理が完了したため、中断していた order(4) の処理に戻る_
・order(n) _// n=4 で呼び出し(続き)
n を出力 _// 4 を出力_
order(tree[n][2]) _// tree[4][2] = 9 なので order(9) として関数を呼び出す_
_※別の関数が呼び出されたため、一旦 order(4) の処理は中断_
・order(n) _// n=9 で呼び出し_
if (tree[n] の 要素数 が 2 と等しい) _// tree[9] = {} で要素数0 のため elseif へ移動_
elseif (tree[n] の 要素数 が 1 と等しい) _// tree[9] = {} で要素数0 のため else へ移動_
else
n を出力 _// 9 を出力_
_※この時点で order(9) の処理が完了したため、中断していた order(4) の処理に戻る_
・order(n) _// n=4 で呼び出し(続き)
_※order(9) として関数を呼び出した後の処理はないため、order(4) の処理も完了。中断していた order(2) の処理に戻る..._
----------
以上、ご不明点あればご連絡いただければと思います。
16の文字コードの問題で64ビットという数字が出てきましたがどのような計算で64が出てきたのか教えていただきたいです😢
質問ありがとうございます。
なぜ64という数値なのか、長くなりますが以下に記載しますのでご確認ください。
ーーーーーーーーーーーーーーーーーー
なぜ64で割った余りが後ろの64ビットになるのか、
まず、2進数で話をする前に、10進数の場合で考えてみましょう。
例として、以下の「xxxxxx」の部分に
10進数「333,222,222,111,111」を右詰めで格納する時の処理を考えます。
対象:33xxxxxx 22xxxxxx 11xxxxxx
まず結果だけ見ると、
33000333 22222222 11111111 になりますよね。
これをプログラムで表現するために
計算上どうやっているかを考えます。以下の通りです。
①11xxxxxx の部分を穴埋め
「333,222,222,111,111」の"右側6桁を取得"
この右側6桁を取得するという計算を具体的な計算式で書くと
「333,222,222,111,111」を1,000,000 で割った余り になります
※333,222,222,111,111 ÷ 1,000,000 = 333,222,222、余り111,111
なぜこのようになるかというと、1,000,000で割るというのは、
小数点を6桁右にずらすと同義で、小数点以下にずれた6桁が余りになるからです
また、1,000,000 で割った商、「333,222,222」
つまり小数点を6桁右にずらした結果の小数点より左側の値を
次の②で使用します
②22xxxxxx の部分を穴埋め
「333,222,222」の"右側6桁を取得"
つまり「333,222,222」を1,000,000 で割った余り を取得
また、1,000,000 で割った商、「333」
つまり小数点を6桁右にずらした結果の小数点より左側の値を次の③で使用します
③33xxxxxx の部分を穴埋め
「333」の"右側6桁を取得"
つまり「333」を1,000,000 で割った余り を取得
問16の内容を全ての値が10進数として扱うと
上記のような計算を行うことで結果を得ることができます
ここでポイントなのは、10進数でいう6桁分の値を抽出するには、
1,000,000で割る = 小数点を6桁右にずらす
(10の6乗で割る)
という処理が必要だということです
問16の内容に戻って、2進数で考えるとき
「小数点を6桁右にずらす」には何をすればよいでしょうか。
これが2進数だと「64で割る」という計算になります。
もっとポイントを押さえた形で書くと、「2の6乗で割る」ということになります。
2進数と10進数の違いは1桁あたりで表現できる数字の数になります。
・2進数の1桁で表現できる数字の数は0と1の2パターン、
・10進数の場合は0,1,2,3,4,5,6,7,8,9の10パターン、
その為「小数点をn桁右側にずらす」ためには、
それぞれ上記のパターン数のn乗で割った余りを求める必要があります。
・2進数の場合:2のn乗で割る
・10進数の場合:10のn乗で割る
ーーーーーーーーーーーーーーーーーー
科目Bの結果が615点だったのでまだちょっと不安ですが、本動画にてトレーニングを重ねたからだと思います。ありがとうございました!
試験お疲れ様でした!
不安かもしれませんが結果を待ちましょう!
受かってましたー🎉
合格おめでとうございます!
問13をdata{1.2}とtarget 2 (解説と同じ組み合わせ)で試す際、
middle ← (low + high) ÷ 2
の処理がありますが、
(1+2)÷ 2 = 1.5になるのではと思いました。
プログラム中の計算結果は少数切り捨てになるのでしょうか?
見当違いでしたらすみません。
いつも分かりやすい動画提供ありがとうございます。
質問ありがとうございます!
ご質問頂いた行の「middle ← (low + high) ÷ 2 の商」となっています。
まず、変数middleは整数型の変数のため、小数点を含めた数値を格納することはできません。
ここからは厳密な定義が引用元の公式サンプル問題には記載されていないので、微妙なところにはなってしまうのですが、ご質問のケースのように割り算の結果が「1.5」となる場合に、変数middleには1.5は格納することができないため、小数点以下が切り捨てられて「1」になっているものと思われます。
このあたりは一般的な考え方だと捉え、公式サンプル問題の定義には記述されていないのかもしれません。
@@itgakko
回答ありがとうございます!
middleが整数型ということを忘れてました、、
解決してよかったです!
勉強頑張って下さい!
この動画のおかげで今日合格出来ました。ありがとうございました。
合格おめでとうございます!
問9再帰呼び出し、そもそもn=2のとき、order(4)になるのがわかりません🥲
order(tree[n][1])のn=2なのは分かりますが、なぜorder(4)に変化するのでしょうか…
質問ありがとうございます。
問9で出てくる tree は二次元配列なので、tree[2][1] は 4 になります。
ここでつまづく場合、おそらく二次元配列を先に学習した方が良いと思います。
下記で学習できますので、よろしければこちらの問6をご確認いただけますでしょうか。
【初心者向け】基本情報技術者試験 科目B|アルゴリズムをゼロから理解する
czcams.com/video/waAwVXa9y2o/video.html
@@itgakko
参考動画拝見しました!二次元配列について理解ができていなかったため、大変助かりました!ありがとうございます!
@@hhhhaku89 よかったです!勉強頑張ってください!
2か月後に基本情報を受けるます!
科目B対策として、基本情報の過去問午後試験を解くなら何問目が良いですか?サンプル問題だけだと心もとない気がして、、
質問ありがとうございます!
アルゴリズムは「データ構造及びアルゴリズム」
セキュリティは「情報セキュリティ」が良いですね。
斎藤先生ご無沙汰しております。まきです。現状報告です。現時点で午後重点対策2週、大滝本とやりましたがやはり再度Javaを復習してプログラミングしてます。写経でソートやリスト類は組みましたが、基礎が身についてないので分かりにくかったのでやはり本腰入れてプログラミングを出来るだけ組んで理解してから再度問題集に戻ります。年末までには受かりたいです。
コメントありがとうございます!
実際にプログラミングしてみるのがやはりいいですね!頑張って下さい!
基本情報技術者 午後問題のデータ構造及びアルゴリズムという項目の過去問を勉強しているのですが、この動画で言っていることは完璧に理解できるし、1人でもできるのに、過去問は解けません。
本番の科目bはどのレベルのものが出るのでしょうか?テスト形式が変わる前のデータ構造及びアルゴリズムレベルの問題が出るのでしょうか?
質問ありがとうございます!
本番の試験でも本動画で取り扱っているような問題が出ますので、
「基本情報技術者 午後問題のデータ構造及びアルゴリズム」ではなく、
可能であれば現行試験の形式の問題を解いて練習した方が良いですね。
私の他の動画でも良いですし、
やり尽くしてしまった場合は、以下の問題集がおすすめです。
77問掲載されていて結構な量を演習できます。
基本情報技術者[科目B]アルゴリズムとプログラミング トレーニング問題集
過去問道場にあるアルゴリズムはもっと長文なのですが、2023からは動画のような短い問題が沢山あるのでしょうか?
質問ありがとうございます!
2023年4月から試験形式が新しくなり、この動画のような短めの問題が主となっています。
@@itgakko
ご回答ありがとうございます!
情報セキュリティも今までと比べるかなり短いようですね。
こちらの動画を使用して勉強したいと思います。
@user-co8ip1ks5b 勉強頑張って下さい!
悔しい…、B試験525点でした…。
また受けます。次は絶対…。
試験お疲れ様でした!
対策して次合格目指しましょう!
問3のOUT(OUTの要素数)なんですが、ここ僕は3が1つしかないから『要素数』と聞かれると1と答えてしまうんですが、これは僕の認識が間違っていますか?要素の値と聞かれれば3と答えるのですが🤔難しい💦
質問ありがとうございます!
問3のプログラムで i = 2 の時に「tail ← out[outの要素数]」が実行された時のことでしょうか?
まず、この時点で「outの要素数」は 1 で合ってます。この時点で配列out = {3} で要素の数が1なので。
その上で、out[outの要素数] は out[1] ということになるので、配列outの1番目の要素である 3 になります。
@@itgakko あー!そうですよね!すぐ[ ]を無視した考え方しちゃうんですよ(´;ω;`)
要素数を入れてOUT[1]として考えないといけないのに、『要素数3?1個なのに?どうして値?』ってなってました(´・ω・`)
ありがとうございました!!
よかったです!
旧試験の午後試験とどっちが難しいと思います??
コメントありがとうございます。
個人的には旧試験の方が難しいと思います。
旧試験はプログラミング未経験の方には非常にとっつきずらかったところがあったのですが、新試験では多少とっつきやすい表現に変わっていると思います。
質問です。
実行結果を書き出す時、変数に入れる値は何でも良いのでしょうか。
また、頭の中で処理できなかった時はとりあえず数字を入れてみる、で良いのでしょうか。
言葉足らずですみません、アドバイスを頂きたいです。
質問ありがとうございます!
実行結果を書き出す時、変数に入れる値は問題によってどうすれば良いか変わります。
・プログラムの実行結果が問われている問題
→問題文に具体的な値がきさいされているはずなのでその通りの値を使う。
・そうでない場合
→基本的になんでも良いです。ただ、繰り返し処理があるなら配列の要素数は2以上にするとか、if文の条件を見て変数の値を決めるだったり少し考える必要があります。
頭の中で処理できなかった場合はおっしゃる通りとりあえず具体的な値を入れてトレースするのがよいですね!
原始的と思われるかもしれませんが紙に書いてみるのがよいです!