プログラム問題



問題1(テクノロジ系)

【キーワード:繰返し/条件分岐/剰余】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は「1から6まで,6を含む」とする)

x ← 0
for i ← 1 to 6 do
  if i mod 3 = 0 then
    x ← x + i
  else
    x ← x + 1
  end if
end for
print(x)


解答1

解説

(テクノロジ系)
for文(反復)で $i=1$ から $6$ まで回し,剰余(mod)で「3の倍数かどうか」を判定して加算する。

よって 13(イ)が正しい。



問題2(テクノロジ系)

【キーワード:配列/最大値探索】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [7, 2, 9, 9, 1]
m ← a[1]
for i ← 2 to 5 do
  if a[i] > m then
    m ← a[i]
  end if
end for
print(m)


解答2

解説

(テクノロジ系)
これは配列から 最大値(max)を求める基本処理。初期値 $m=a[1]=7$ とし,2番目以降を見て より大きければ更新する。

よって出力は 9(イ)。



問題3(テクノロジ系)

【キーワード:文字列/カウント】
次の擬似言語は,文字列 t に含まれる文字 'o' の個数を数える処理である。出力される値として正しいものはどれか。
(文字列の添字は1から始まり,length(t) は文字数を返す)

t ← "tokyo"
count ← 0
for i ← 1 to length(t) do
  if t[i] = 'o' then
    count ← count + 1
  end if
end for
print(count)


解答3

解説

(テクノロジ系)
文字列 "tokyo" は t o k y o の5文字で,'o' は2回(2文字目と5文字目)出現する。よって count=2(イ)。



問題4(テクノロジ系)

【キーワード:繰返し/変数更新】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。

n ← 5
p ← 1
while n > 1 do
  p ← p * n
  n ← n - 2
end while
print(p)


解答4

解説

(テクノロジ系)
while文(反復)で $n>1$ の間,$p$ に $n$ を掛け,$n$ を2ずつ減らす。

よって出力は 15(ウ)。



問題5(テクノロジ系)

【キーワード:条件分岐/代入】
次の擬似言語を実行したとき,出力される a と b の組として正しいものはどれか。

a ← 4
b ← 7
if a > b then
  temp ← a
  a ← b
  b ← temp
else
  b ← b - a
end if
print(a, b)


解答5

解説

(テクノロジ系)
条件は $a>b$ かどうか。初期値は $a=4,b=7$ なので $a>b$ は偽。よって else 節が実行され,$b←b-a$ となる。

よって出力は (4,3)(ア)。



問題6(テクノロジ系)

【キーワード:配列/条件分岐/加減算】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [2, 5, 7, 1, 6]
s ← 0
for i ← 1 to 5 do
  if a[i] mod 2 = 0 then
    s ← s + a[i]
  else
    s ← s - a[i]
  end if
end for
print(s)


解答6

解説

(テクノロジ系)
配列の各要素について,偶数なら加算奇数なら減算する。

よって -5(ア)。



問題7(テクノロジ系)

【キーワード:while/剰余/カウント】
次の擬似言語は,1から20までの整数のうち,3の倍数の個数を数える処理である。出力される値として正しいものはどれか。

i ← 1
c ← 0
while i ≤ 20 do
  if i mod 3 = 0 then
    c ← c + 1
  end if
  i ← i + 1
end while
print(c)


解答7

解説

(テクノロジ系)
1~20の3の倍数は 3,6,9,12,15,18 の6個。よって c=6(イ)。



問題8(テクノロジ系)

【キーワード:二重ループ/積の加算】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)

s ← 0
for i ← 1 to 3 do
  for j ← 1 to 2 do
    s ← s + i * j
  end for
end for
print(s)


解答8

解説

(テクノロジ系)
二重ループで $i=1,\ldots,3$,$j=1,\ldots,2$ の全組合せについて $i*j$ を加算する。

$$ \begin{aligned} s&=(1\cdot1+1\cdot2) \\ &+(2\cdot1+2\cdot2) \\ &+(3\cdot1+3\cdot2) \\ &= (1+2)+(2+4)+(3+6) \\ &= 3+6+9=18 \end{aligned} $$

よって 18(ウ)。



問題9(テクノロジ系)

【キーワード:関数/反復/条件分岐】
次の擬似言語を実行したとき,最終的に出力される値として正しいものはどれか。
(整数の割り算は割り切れるものとする)

function f(n)
  if n mod 2 = 0 then
    return n / 2
  else
    return 3*n + 1
  end if
end function

x ← 6
for k ← 1 to 3 do
  x ← f(x)
end for
print(x)


解答9

解説

(テクノロジ系)
関数 f(n) は「偶数なら半分,奇数なら $3n+1$」を返す。

よって最終出力は 5(イ)。



問題10(テクノロジ系)

【キーワード:配列/要素の挿入/後ろからシフト】
次の擬似言語は,配列 a の pos 番目に val を挿入するため,後ろの要素を1つずつ後方へずらす処理である。出力される配列として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [1, 2, 3, 4, 5]
pos ← 3
val ← 9

for i ← 5 down to pos + 1 do
  a[i] ← a[i - 1]
end for
a[pos] ← val

print(a[1], a[2], a[3], a[4], a[5])


解答10

解説

(テクノロジ系)
挿入のために 後ろから(down to) シフトするのがポイント。前からずらすと上書きが起きやすい。

初期:a=[1,2,3,4,5],pos=3

よって (1,2,9,3,4)(ア)。



問題11(テクノロジ系)

【キーワード:整数除算/剰余/桁の処理】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
div は整数除算,mod は剰余を表す)

n ← 5072
s ← 0
while n > 0 do
  s ← s + (n mod 10)
  n ← n div 10
end while
print(s)


解答11

解説

(テクノロジ系)
これは整数 $n$ の 各桁の和を求める典型処理。n mod 10最下位桁を取り出し,n div 101桁削る

よって 14(ウ)。



問題12(テクノロジ系)

【キーワード:配列/探索/最小値】
次の擬似言語は,配列 a の最小値を求める処理である。出力される値として正しいものはどれか。
(配列の添字は1から始まる)

a ← [8, 3, 6, 2, 7]
m ← a[1]
for i ← 2 to 5 do
  if a[i] < m then
    m ← a[i]
  end if
end for
print(m)


解答12

解説

(テクノロジ系)
初期値 $m=a[1]=8$ とし,2番目以降を見て より小さければ更新する。これは 最小値(min)探索の基本。

よって 2(ア)。



問題13(テクノロジ系)

【キーワード:論理演算/優先順位】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
and は論理積,or は論理和,not は否定であり,優先順位は notandor とする)

a ← true
b ← false
c ← true

if (a and b) or (not b and c) then
  print(1)
else
  print(0)
end if


解答13

解説

(テクノロジ系)
式を部分ごとに評価する。

従って if 条件は真となり,1(イ)を出力する。



問題14(テクノロジ系)

【キーワード:キュー/先入れ先出し】
次の操作を順に行ったとき,最後に dequeue で取り出される値として正しいものはどれか。
(キューは 先入れ先出し(FIFO)とする)

enqueue(10)
enqueue(20)
x ← dequeue()
enqueue(30)
enqueue(x)
y ← dequeue()
z ← dequeue()
print(z)


解答14

解説

(テクノロジ系)
キュー(queue)は FIFO:先に入れたものから先に出る。

操作を追う(左が先頭):

よって 30(ウ)。



問題15(テクノロジ系)

【キーワード:線形探索/見つかった位置】
次の擬似言語は,配列 a から値 key を探索し,見つかった位置(添字)を pos に格納して出力する。出力される pos の値として正しいものはどれか。
(見つからない場合は pos は -1 のままとする。配列の添字は1から始まる)

a ← [4, 6, 6, 2, 6]
key ← 6
pos ← -1

for i ← 1 to 5 do
  if a[i] = key then
    pos ← i
  end if
end for

print(pos)


解答15

解説

(テクノロジ系)
この探索は一致するたびに pos ← i上書きするため,最終的には「最後に見つかった位置」が残る。

配列 a=[4,6,6,2,6] で key=6 は 2,3,5 番目にある。
ループ終了時点で pos は最後の一致位置 5 となる。よって 5(エ)。



問題16(テクノロジ系)

【キーワード:スタック/後入れ先出し】
次の操作を順に行ったとき,最後に pop で取り出される値として正しいものはどれか。
(スタックは 後入れ先出し(LIFO)とする)

push(1)
push(2)
push(3)
x ← pop()
push(4)
push(x)
y ← pop()
z ← pop()
print(z)


解答16

解説

(テクノロジ系)
スタック(stack)は LIFO:後から入れたものから先に出る。

操作を追う(右がトップ):

ここで z=4 なので正解は に見えるが,問は「最後にpopで取り出される値として」とあるため,z ← pop() が最後の pop で取り出した値、すなわち 4。したがって正解は

(解答を に訂正する。)



問題17(テクノロジ系)

【キーワード:二分探索/比較回数】
昇順に整列された要素数16の配列に対して,二分探索で目的の要素を探索する。最悪の場合に必要な比較回数として正しいものはどれか。
(比較回数は「中央値との大小比較」を1回と数える)



解答17

解説

(テクノロジ系)
二分探索は探索範囲を半分に絞る。要素数 $n$ のとき最悪比較回数はおおむね $\lceil\log_2 n\rceil$ 回。

$$ \log_2 16 = 4 $$

ただし「見つからない場合」も含む最悪ケースでは,探索範囲が 1 要素になったあとにもう一度比較が発生しうるため,ITパスポートの典型の数え方では 5回とすることが多い(範囲判定・終了判定を含める扱い)。
したがって 5(イ)が正しい。



問題18(テクノロジ系)

【キーワード:ソート/交換回数】
次の擬似言語は,配列 a を昇順に並べ替える処理である。処理終了後の配列として正しいものはどれか。
(for文の範囲は上限を含む。a[i] と a[j] を入れ替える操作を swap とする)

a ← [3, 1, 2]
for i ← 1 to 2 do
  for j ← i + 1 to 3 do
    if a[i] > a[j] then
      swap(a[i], a[j])
    end if
  end for
end for
print(a[1], a[2], a[3])


解答18

解説

(テクノロジ系)
これは 選択ソート(selection sort)に近い動きで,前の位置に小さい値を持ってくる。

手順追跡:

よって (1,2,3)(ア)。



問題19(テクノロジ系)

【キーワード:再帰/呼び出し回数】
次の擬似言語を実行したとき,g(3) の戻り値として正しいものはどれか。

function g(n)
  if n = 0 then
    return 0
  else
    return n + g(n - 1)
  end if
end function

print(g(3))


解答19

解説

(テクノロジ系)
これは再帰で 1からnまでの和を求める形。

$$ \begin{aligned} g(3)&=3+g(2)\ g(2)&=2+g(1)\ g(1)&=1+g(0)\ g(0)&=0 \end{aligned} $$

よって

$$ g(3)=3+2+1+0=6 $$

従って 6(イ)。



問題20(テクノロジ系)

【キーワード:フローチャート/条件分岐/反復回数】
ある処理は次の規則で動く。初期値 $x=1$ とし,処理を3回繰り返したときの $x$ の値として正しいものはどれか。
(各回で次の操作を行う:$x$ が偶数なら $x←x/2$,奇数なら $x←2x+1$)



解答20

解説

(テクノロジ系)
初期 $x=1$(奇数)から開始し、3回更新する。

よって 15(ウ)。



問題21(テクノロジ系)

【キーワード:二重ループ/回数カウント】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)

x ← 0
for i ← 1 to 4 do
  for j ← 1 to i do
    x ← x + 1
  end for
end for
print(x)


解答21

解説

(テクノロジ系)
内側のループは,外側の $i$ に応じて $i$ 回だけ回る。よって加算回数は

$$ 1+2+3+4=10 $$

したがって出力は 10(イ)。



問題22(テクノロジ系)

【キーワード:整数除算/while/桁数】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
div は整数除算を表す)

n ← 100
c ← 0
while n > 0 do
  n ← n div 10
  c ← c + 1
end while
print(c)


解答22

解説

(テクノロジ系)
n div 10 により $n$ を 10 で割った整数に更新し,0 になるまで繰り返す。これは 桁数(digit count)を数える典型処理。

よって出力は 3(ウ)。



問題23(テクノロジ系)

【キーワード:文字列/連結/逆順】
次の擬似言語を実行したとき,出力される文字列として正しいものはどれか。
(文字列の添字は1から始まり,length(t) は文字数を返す)

t ← "abcd"
u ← ""
for i ← length(t) down to 1 do
  u ← u + t[i]
end for
print(u)


解答23

解説

(テクノロジ系)
down to で末尾から先頭へ走査し,u ← u + t[i]文字列連結するので,文字列が逆順に構成される。
"abcd" の逆順は "dcba"。よって(イ)。



問題24(テクノロジ系)

【キーワード:ビット演算/AND】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
& はビットごとの AND を表す)

a ← 12
b ← 10
print(a & b)


解答24

解説

(テクノロジ系)
12 と 10 を2進数で表す。

ビットごとの AND(両方が1のビットだけ1)なので,

$$ 1100_2\ &\ 1010_2 = 1000_2 $$

$1000_2=8$ よって 8(イ)。



問題25(テクノロジ系)

【キーワード:配列/最大最小/平均】
次の擬似言語は,配列 a の要素から最大値と最小値を除いた残りの平均値を求める処理である。出力される値として正しいものはどれか。
(割り算は実数の割り算とし,小数が出る場合はそのまま出力する)

a ← [4, 8, 2, 6, 10]
max ← a[1]
min ← a[1]
sum ← 0

for i ← 1 to 5 do
  sum ← sum + a[i]
  if a[i] > max then
    max ← a[i]
  end if
  if a[i] < min then
    min ← a[i]
  end if
end for

avg ← (sum - max - min) / 3
print(avg)


解答25

解説

(テクノロジ系)
配列の合計は $4+8+2+6+10=30$,最大値は 10,最小値は 2

除外後の合計は $30-10-2=18$。残り3要素の平均は

$$ avg=\frac{18}{3}=6 $$

よって 6(ウ)。



問題26(テクノロジ系)

【キーワード:for/剰余/合計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)

x ← 0
for i ← 1 to 10 do
  if i mod 2 = 0 then
    x ← x + i
  end if
end for
print(x)


解答26

解説

(テクノロジ系)
i mod 2 = 0偶数判定。よって 1~10 の偶数(2,4,6,8,10)だけを加算する。

$$ 2+4+6+8+10=30 $$

したがって 30(ウ)。



問題27(テクノロジ系)

【キーワード:while/整数除算/回数カウント】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
div は整数除算を表す)

n ← 1000
c ← 0
while n > 0 do
  n ← n div 2
  c ← c + 1
end while
print(c)


解答27

解説

(テクノロジ系)
n div 2 で $n$ を半分(切り捨て)にし,0 になるまでの 反復回数を数える。

更新を追う:

よって 10(ウ)。



問題28(テクノロジ系)

【キーワード:配列/削除/左シフト】
次の擬似言語は,配列 a の pos 番目の要素を削除し,後続要素を左に1つずつ詰める処理である。出力される配列として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [1, 2, 3, 4, 5]
pos ← 2

for i ← pos to 4 do
  a[i] ← a[i + 1]
end for
a[5] ← 0

print(a[1], a[2], a[3], a[4], a[5])


解答28

解説

(テクノロジ系)
pos=2 を削除するため,i=2..4 で a[i] に a[i+1] を代入し,末尾は 0 を入れる(空きを表す)。

よって (1,3,4,5,0)(ア)。



問題29(テクノロジ系)

【キーワード:再帰/階乗】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。

function fact(n)
  if n = 1 then
    return 1
  else
    return n * fact(n - 1)
  end if
end function

print(fact(4))


解答29

解説

(テクノロジ系)
これは 階乗を再帰で求める処理。$fact(4)$ は

$$ \begin{aligned} fact(4)&=4\cdot fact(3)\ fact(3)&=3\cdot fact(2)\ fact(2)&=2\cdot fact(1)\ fact(1)&=1 \end{aligned} $$

よって

$$ fact(4)=4\cdot3\cdot2\cdot1=24 $$

従って 24(エ)。



問題30(テクノロジ系)

【キーワード:条件分岐/配列/カウンタ】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [1, 2, 3, 2, 1]
key ← 2
c ← 0

for i ← 1 to 5 do
  if a[i] = key then
    c ← c + 1
  else
    c ← c + 2
  end if
end for

print(c)


解答30

解説

(テクノロジ系)
a[i] が key(2)なら +1,それ以外は +2 を加算する カウンタ処理

配列は [1,2,3,2,1]:

よって 8(ウ)。



問題31(テクノロジ系)

【キーワード:for/条件分岐/代入】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む)

x ← 1
for i ← 1 to 5 do
  if i ≤ 3 then
    x ← x * (i + 1)
  else
    x ← x - i
  end if
end for
print(x)


解答31

解説

(テクノロジ系)
$ i=1,\ldots,5 $ を順に追う。$i≤3$ の間は乗算,それ以降は減算。

よって 15(イ)。



問題32(テクノロジ系)

【キーワード:ビットシフト/反復/条件分岐】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
<< 1 は1ビット左シフトであり,整数を2倍するものとする)

x ← 5
for i ← 1 to 3 do
  x ← x << 1
  if x > 20 then
    x ← x - 3
  end if
end for
print(x)


解答32

解説

(テクノロジ系)
x ← x << 12倍。各回の結果を追う。

よって 37(イ)。



問題33(テクノロジ系)

【キーワード:2次元配列/添字/集計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まる)

a ← [[1,2,3],
     [4,5,6],
     [7,8,9]]
s ← 0
for i ← 1 to 3 do
  s ← s + a[i][i]
end for
print(s)


解答33

解説

(テクノロジ系)
a[i][i]主対角要素(左上→右下)。よって加算するのは 1,5,9。

$$ s=1+5+9=15 $$

したがって 15(イ)。



問題34(テクノロジ系)

【キーワード:探索/break/最初の一致】
次の擬似言語を実行したとき,出力される pos の値として正しいものはどれか。
(配列の添字は1から始まる)

a ← [9, 7, 7, 2]
key ← 7
pos ← -1

for i ← 1 to 4 do
  if a[i] = key then
    pos ← i
    break
  end if
end for

print(pos)


解答34

解説

(テクノロジ系)
break により,最初に一致した時点でループを終了する。配列 [9,7,7,2] で key=7 は 2番目が最初の一致なので pos=2。よって 2(イ)。



問題35(テクノロジ系)

【キーワード:バブルソート/隣接交換/交換回数】
次の擬似言語は,配列 a に対して隣接要素の比較と交換を左から1回だけ行う(1パス)処理である。出力される swaps の値として正しいものはどれか。
(配列の添字は1から始まる)

a ← [3, 2, 1, 4]
swaps ← 0
for i ← 1 to 3 do
  if a[i] > a[i + 1] then
    swap(a[i], a[i + 1])
    swaps ← swaps + 1
  end if
end for
print(swaps)


解答35

解説

(テクノロジ系)
1パスのバブルソートは,隣接比較で大きい方を右へ送る。交換回数を追う。

初期:[3,2,1,4]

よって swaps は 2(イ)。



問題36(テクノロジ系)

【キーワード:2次元配列/列の合計/反復】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(配列の添字は1から始まり,for文の範囲は上限を含む)

a ← [[2,5,1],
     [4,3,6],
     [7,8,9]]
s ← 0
for i ← 1 to 3 do
  s ← s + a[i][2]
end for
print(s)


解答36

解説

(テクノロジ系)
a[i][2]第2列(5,3,8)を表す。よって

$$ s=5+3+8=16 $$

したがって 16(イ)。



問題37(テクノロジ系)

【キーワード:ビット演算/XOR/排他的論理和】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
^ はビットごとの XOR(排他的論理和)を表す)

a ← 12
b ← 10
print(a ^ b)


解答37

解説

(テクノロジ系)
12 と 10 を2進数で表す。

XOR は「ビットが異なるとき1」なので,

$$ 1100_2\ \hat{}\ 1010_2 = 0110_2 $$

$0110_2=6$ ……ではなく,ここで ^ を XOR として扱うなら結果は 6 であるため正解は 。よって解答を に訂正する。



問題38(テクノロジ系)

【キーワード:手続/引数/カウント】
次の擬似言語は,配列 a の中で値 v より大きい要素の個数を数える処理である。空欄 A に入る式として正しいものはどれか。

function countGreater(a, v)
  c ← 0
  for i ← 1 to length(a) do
    if a[i] > v then
      c ← A
    end if
  end for
  return c
end function

a ← [3, 7, 2, 9, 7]
print(countGreater(a, 6))


解答38

解説

(テクノロジ系)
条件 a[i] > v を満たすたびに,個数カウンタ c を 1 増やす必要があるので A は c+1

(参考:v=6 のとき 7,9,7 の3個が該当し,戻り値は 3 になる。)



問題39(テクノロジ系)

【キーワード:ユークリッドの互除法/while/剰余】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
mod は剰余を表す)

a ← 48
b ← 18
while b ≠ 0 do
  r ← a mod b
  a ← b
  b ← r
end while
print(a)


解答39

解説

(テクノロジ系)
これは ユークリッドの互除法で,$a$ と $b$ の 最大公約数(GCD)を求める。

手順:

よって出力は 6(イ)。



問題40(テクノロジ系)

【キーワード:continue/条件分岐/合計】
次の擬似言語を実行したとき,出力される値として正しいものはどれか。
(for文の範囲は上限を含む。continue は以降の処理を行わず次の反復に移る)

s ← 0
for i ← 1 to 6 do
  if i mod 2 = 0 then
    continue
  end if
  s ← s + i
end for
print(s)


解答40

解説

(テクノロジ系)
i mod 2 = 0 は偶数判定。偶数のとき continue で加算をスキップするので,足すのは奇数(1,3,5)のみ。

$$ s=1+3+5=9 $$

よって 9(イ)。

← → キーで移動 / Ctrl+P でPDF保存