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

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

ただいまの
回答率

90.52%

  • 基本情報技術者

    46questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 863

ai5

score 32

基本情報技術者

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

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

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

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

イメージ説明

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • turbgraphics200

    2017/03/02 19:51

    Tango[1]じゃなくTango[0]なんじゃ?

    キャンセル

  • Zuishin

    2017/03/02 20:04

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

    キャンセル

  • ai5

    2017/03/03 09:49

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

    キャンセル

回答 3

checkベストアンサー

+4

要素番号は増やしていません。
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/13 18:13

    追記ありがとうございます。

    [2] = "orange" となり、Tango[i + 1] = Tango[3] = "grape" となります。
    →ここまではわかります

    この時 Tango[i] → Tango[i + 1] の操作を行うと、配列は次のようになります。
    Tango = ["", "apple", "orange", "orange"]
    ただ、i=2 の操作を行うとなぜTango[4] = "orange"になるのかわかりません。

    キャンセル

  • 2017/03/13 19:31

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

    キャンセル

  • 2017/03/13 20: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 までです。

    キャンセル

  • 2017/03/14 09:15

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

    キャンセル

  • 2017/03/14 09:35

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

    キャンセル

  • 2017/03/14 09:42

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

    キャンセル

  • 2017/03/14 09:47

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

    キャンセル

  • 2017/03/14 09:50

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

    キャンセル

  • 2017/03/14 10:14

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

    キャンセル

  • 2017/03/14 10:21

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

    キャンセル

  • 2017/03/14 11:44

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

    キャンセル

  • 2017/03/14 12:14

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

    キャンセル

  • 2017/03/14 13:13 編集

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

    キャンセル

+1

配列の数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/03 09: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]

    キャンセル

  • 2017/03/03 09:58

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

    キャンセル

+1

わかりにくい

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

僕なら本なげそ。。

★処理の流れはこんな感じになると思います★
①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/13 18:00 編集

    返信遅くなって申し訳ございません。
    初心者目線で解説してくださってそのお心痛み入ります。

    まだ、私の知識が足りないせいか完全消化できていなくて難しいです。

    配列の添え字と n番目の単語がごっちゃになっていて
    それぞれのループの条件もごっちゃになっています。。。

    参考書籍は
    うかる!福嶋先生の集中ゼミ  基本情報です。

    キャンセル

  • 2017/03/16 11:56

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    xcodeでの画面サイズ変更方法

    swiftでサンプルコードを写しているのですが、参考書を今まで放置してたのでxcodeのバージョンが違うので画面サイズ変更の方法がわからないです。 simulatorでの表示画面

  • 解決済

    UIScrollViewのStoryboards上でのY座標がおかしい

    UIScrollViewの設定値が、どうしても最上部がマイナス値になってしまいます。 contentOffsetの値を、実行中に y:-56 とかにするとうまく表示されるので

  • 解決済

    push遷移とmodal遷移を混在させる

    まず以下のようにそれぞれの画面間をpush遷移させると左の画面→真ん中の画面→右の画面というふうに画面が遷移していきます。 今度は左の画面から右の画面に以下のようにm

  • 解決済

    ACCESS クエリでの一部重複?の除外方法について

    前提・実現したいこと こんにちは、質問タイトルが適格でないかもしれませんが宜しくお願いいたします。 通販事業をしており、商品の仕入から販売までのデータベースをACCESSの

  • 解決済

    Swift NavigationContollerの画面遷移をフェードインで行いたい

    Storyboadを使い、NavigationContollerにて画面遷移を行なっております。 Firstviewにボタンを起き、Ctrl + ドラッグでSecondviewに

  • 解決済

    cloud9のコマンドラインの出し方

    わからないこと cloud9を使っていて、コマンドラインを消してしまって出し方がわからなくなってしまいました。 いろいろ探してみましたが見つかりませんでした。 とても

  • 解決済

    Pickerがうまく作動しない

    プログラミングを始めて数ヶ月のものです。 今回、ピッカーを利用したアプリを作ろうとしていたのですが、以前こちらで伺ったように行ってみてもうまくいきませんでした。 https

  • 解決済

    IntelliJ IDEA でKotlinの実行ができない

    実現したいこと IntelliJ IDEAで Kotlinのプログラムを実行したいです。 しかしエラーが表示されてしまいます。 ソースコード package sampl

同じタグがついた質問を見る

  • 基本情報技術者

    46questions

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