質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

3回答

5236閲覧

【基本情報技術者試験】配列のアルゴリズム

ai5

総合スコア40

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2017/03/02 10:42

基本情報技術者

次のアルゴリズムの問題の質問です。

要素番号が0から始まる配列TANGOがある。n個の単語がTANGO[1]から
TANGO[n]に入っている。
図は、n番目の単語をTANGO[1]に移動するために、TANGO[1]からTANGO[n-1]の単語を順に一つずつ後ろにずらして単語表を再構成する流れ図である。

aに入れる処理として、適切なものは何ですか?

※ここで言ってるaとはループで挟まれている、
Tango[i]→Tango[i+1] です。

イメージ説明

ここでわからないのが、ループの条件では減らしている一方で
配列の要素番号を増やしてる点です。

また、解説で、上から単語を移動すると、移動していない単語が
消えるが、下から移動すると、移動済みなので、問題ないという部分が理解できないです。

長々となりましたが、ご教授宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/03/02 11:04

turbgraphics200 さん、Tango[0] はバッファで、ここに Tango[n] を移動した後 0 から n - 1 までの要素を順に繰り上げることで Tango[1] に移動するという意味だと思います。この時 Tago[0] と Tango[1] は最終的に同じ値になりますが、Tango[0] は他の用途で使わないのでしょう。
ai5

2017/03/03 00:49

すみません、まだ私の知識では理解できないです。。
guest

回答3

0

ベストアンサー

要素番号は増やしていません。
Tango[i] は Tango[i + 1] の前の要素です。
例えば次の配列
Tango = ["", "apple", "orange", "grape"]
では、Tango[0] は "" で Tango[1] は "apple" となりますが、ここで i = 2 の時、Tango[i] = Tango[2] = "orange" となり、Tango[i + 1] = Tango[3] = "grape" となります。
この時 Tango[i] → Tango[i + 1] の操作を行うと、配列は次のようになります。
Tango = ["", "apple", "orange", "orange"]

追記

書き間違えていたところを修正しました。

投稿2017/03/02 10:57

編集2017/03/02 11:06
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2017/03/13 09:13

追記ありがとうございます。 [2] = "orange" となり、Tango[i + 1] = Tango[3] = "grape" となります。 →ここまではわかります この時 Tango[i] → Tango[i + 1] の操作を行うと、配列は次のようになります。 Tango = ["", "apple", "orange", "orange"] ただ、i=2 の操作を行うとなぜTango[4] = "orange"になるのかわかりません。
swordone

2017/03/13 10:31

配列の番号は0始まりなので、そこはTango[3]です。
Zuishin

2017/03/13 11:24

Tango = ["", "apple", "orange", "grape"] の時、Tango[2] = "orange" で Tango[3] = "grape" です。 Tango[i] → Tango[i + 1] の操作を行う、つまり Tango[i + 1] に Tango[i] の内容を入れる操作を行う、つまり、i = 2 ですから、Tango[3] に Tango[2] の内容を入れると、Tango = ["", "apple", "orange", "orange"] となります。grape のところに orange が入りました。 swordone さんのおっしゃる通り、ここでは Tango[4] というのは定義されていません。0 から 3 までです。
ai5

2017/03/14 00:15

なるほどですね。 もう少しでわかりそうな気がします。 上書きされたgrapeはどこにいってしまったのですか?
swordone

2017/03/14 00:35

上書きされて消えます。 それだと困るので、最初にTango[0]に退避させます。
ai5

2017/03/14 00:42

どうやって退避させるんですか?
swordone

2017/03/14 00:47

ループに入る前にやってます。
ai5

2017/03/14 00:50

ありがとうございます。 swordoneさんにベストアンサーにしたいのですが、ここからだとできませんかね?
Zuishin

2017/03/14 01:14

swordone さん、回答してあげてください。
swordone

2017/03/14 01:21

この回答につけてください。
ai5

2017/03/14 02:44

回答のベストアンサー表示されませんね。。
Zuishin

2017/03/14 03:14

swordone さんのおっしゃる回答というのは私の回答という意味です。質問、回答、コメントと用語が決まっています。これはコメントです。
ai5

2017/03/14 04:15 編集

わかりました。Zuishinさんベストアンサーにさせて頂きました。
guest

0

わかりにくい

基本を学ぶためのものとしては不親切な解説だなぁ

僕なら本なげそ。。

★処理の流れはこんな感じになると思います★
①N番目を1番目に移動する。

②N番目が移動後に空っぽになる。

③Nの一つ前の要素(N-1=i)に格納されている単語は、一つ後ろの要素(i+1)に移動する。

ここでわからないのが、ループの条件では減らしている一方で
配列の要素番号を増やしてる点です。

これは上の③のことだと思いますよ。
移動したいN番目を移動したら、N番目が空っぽになったので、その一つ前の要素(N-1)をNに移動する。
そうすると今度は、N-1が空っぽになるので、N-2をN-1に移動する。
これはNという移動元の要素が基点なので引き算になっていますが、移動元と移動先の表現なだけで

「N-2をN-1」へ移動
これは
「iをi+1」へ移動
と同じですよね。(対象の変数の一つ後ろ、という表現ですね)

つまり
「ループの条件では減らしている」
というのはN番目から前へ処理対象の要素を移動させる、という意味で正しいです。
また、
「配列の要素番号を増やしてる」というのも、「増やす」という表現が少し分かりづらいですが
対象の要素(i)に格納された値(単語)を一つ後ろの要素(i+1)に移動させる、という事なので
各単語の格納されている要素(i)を増やす(i+1に移動)という意味では正しいです。

また、解説で、上から単語を移動すると、移動していない単語が
消えるが、下から移動すると、移動済みなので、問題ないという部分が理解できないです。

これは。。。むむむ。。
「上から単語を移動する」 → i番目の値をiより小さい方向へ移動
「下から移動する」 → i番目の値をiより大きい方向へ移動
ということをいっているのではないかと思います。
そういう意味では正しいと思います。

ただ、わかりにくい。。。
何かの参考書の類ですかね。
「上から」とか「下から」とか「主語」がない曖昧な表現だらけですね。

「n番目の単語をTANGO[1]に移動する」と「単語は消えては駄目」という要件なので
TANGO[1]は空っぽで「n番目の単語をTANGO[1]に移動」した時点で、TANGO[1]は空っぽにならないよね。。
とか考えしまいました。

間違っていたらごめんなさい。たぶんあっていると思います。

投稿2017/03/03 01:28

kometaroimo

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2017/03/13 09:01 編集

返信遅くなって申し訳ございません。 初心者目線で解説してくださってそのお心痛み入ります。 まだ、私の知識が足りないせいか完全消化できていなくて難しいです。 配列の添え字と n番目の単語がごっちゃになっていて それぞれのループの条件もごっちゃになっています。。。 参考書籍は うかる!福嶋先生の集中ゼミ  基本情報です。
kometaroimo

2017/03/16 02:56

返信ありがとうございます。 きっとごちゃごちゃ書いてしまったので、ピンと来なかったかも。。 もっとポイントを絞って分かりやすく書けたら。。と個人的にも反省点がありました。 あと、質問する姿勢、、と言いますか「理解する」という事に真剣なんだろうな、、 という事が、伝わる質問の仕方だと思いました。 この業界では、実はそれってすごく長所で武器になります。 折れずに、がんばってください! 「うかる!福嶋先生の集中ゼミ」は立ち読みしてみます~♪
guest

0

配列の数4で 配列番号 3 にものを配列番号 1 に移動させる例で考えてみます。

D を 配列番号 0 に移動させたあと、左から右に移動していった場合 0 1 2 3 [ ] [B] [C] [D] // 配列番号 3 の D を配列番号 0 にコピー [D] [B] [C] [D] // 配列番号 1 の B を配列番号 2 にコピー [D] [B] [B] [D] // C が消えてしまった! // 配列番号 2 の B を配列番号 3 にコピー [D] [B] [B] [B] // D が消えてしまった! // 配列番号 0 の D を配列番号 1 にコピー [D] [D] [B] [B]
D を 配列番号 0 に移動させたあと、右から左に移動していった場合 0 1 2 3 [ ] [B] [C] [D] // 配列番号 3 の D を配列番号 0 にコピー [D] [B] [C] [D] // 配列番号 2 の C を配列番号 3 にコピー [D] [B] [C] [C] // 配列番号 1 の B を配列番号 2 にコピー [D] [B] [B] [C] // 配列番号 0 の D を配列番号 1 にコピー [D] [D] [B] [C]

投稿2017/03/02 13:47

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2017/03/03 00:48

D を 配列番号 0 に移動させたあと、左から右に移動していった場合 0 1 2 3 [ ] [B] [C] [D] ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー // 配列番号 3 の D を配列番号 0 にコピーしたあと、Dをそのまま配列番号1にコピーすれば、ものを移動できると思うのですが、いかがですか? なぜ配列番号 2 の C を配列番号 3 にコピー、// 配列番号 1 の B を配列番号 2 にコピーするのかがわかりません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー [D] [B] [C] [D] // 配列番号 1 の B を配列番号 2 にコピー [D] [B] [B] [D] // C が消えてしまった! // 配列番号 2 の B を配列番号 3 にコピー [D] [B] [B] [B] // D が消えてしまった! // 配列番号 0 の D を配列番号 1 にコピー [D] [D] [B] [B]
swordone

2017/03/03 00:58

ここ最近の質問連投見てたが、自分で考えられないのか… そのまま配列番号1に入れたら、もともと配列番号1にあったBが上書きされて消えてしまう。 それをしないように、全部の要素の位置をひとつずつ上にずらそうって話なのに、全く見えてないのか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問