paiza プログラミング

[Ruby|Python]paiza 標準入力メニュー セクション9(ペア)

paiza_stdin_9

今回はpaiza 標準入力メニューセクション9(ペアの入力)を解説します。

セクション9は、1行目でデータ数nが与えられ、続くn行のペアになったデータを受け取る問題です。

本記事で使用しているメソッドについて

解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。

セクション9:【組になったデータの入力】文字列と整数の組からの選択

9-STEP1: 1 つの整数の組の入力 (paizaランク D 相当)

半角スペースで区切られた整数a, b を受け取り、半角スペースで連結して1行で出力する問題です。

入出力例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 入出力例
INPUT1 = <<~"EOS"
8 13
EOS
OUTPUT1 = <<~"EOS"
8 13
EOS
# 入出力例 INPUT1 = <<~"EOS" 8 13 EOS OUTPUT1 = <<~"EOS" 8 13 EOS
# 入出力例
INPUT1 = <<~"EOS"
  8 13
EOS
OUTPUT1 = <<~"EOS"
  8 13
EOS
Ruby解答例

まず、半角スペースで区切られた2個の整数を受け取り、配列pairに格納します。
次に、配列pairの各要素(整数a, 整数b)を、.join(" ")で半角スペースで連結した文字列を出力します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
# 入力
pair = gets.split.map(&:to_i)
# 出力
puts(pair.join(" "))
# 解答例 # 入力 pair = gets.split.map(&:to_i) # 出力 puts(pair.join(" "))
# 解答例
# 入力
pair = gets.split.map(&:to_i)
# 出力
puts(pair.join(" "))
Python解答例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
# 入力
pair = [*map(int, input().split())]
# 出力
print(*pair)
# 解答例 # 入力 pair = [*map(int, input().split())] # 出力 print(*pair)
# 解答例
# 入力
pair = [*map(int, input().split())]
# 出力
print(*pair)

 


9-STEP2: N 組の整数の入力 (paizaランク D 相当)

1行目で要素数nが与えられ、続くn行の半角スペース区切りのペアのデータを整数型に変換して受け取り、先頭から順に改行区切りで出力する問題です。

入出力例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 入出力例
INPUT1 = <<~"EOS"
5
813 813
8 13
81 1
81 3
8 813
EOS
OUTPUT1 = <<~"EOS"
813 813
8 13
81 1
81 3
8 813
EOS
# 入出力例 INPUT1 = <<~"EOS" 5 813 813 8 13 81 1 81 3 8 813 EOS OUTPUT1 = <<~"EOS" 813 813 8 13 81 1 81 3 8 813 EOS
# 入出力例
INPUT1 = <<~"EOS"
  5
  813 813
  8 13
  81 1
  81 3
  8 813
EOS
OUTPUT1 = <<~"EOS"
  813 813
  8 13
  81 1
  81 3
  8 813
EOS
Ruby解答例1

1行目でデータ数nを受け取り、続くn行の文字列を半角スペースで分割し、整数型の要素数2個の配列にして、配列aryへ格納しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例1
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map { gets.split.map(&:to_i) }
# 出力
pairs.each { |pair| puts(pair.join(" ")) }
# 解答例1 # 1 行目入力 n = gets.to_i # 続く n 行入力 pairs = n.times.map { gets.split.map(&:to_i) } # 出力 pairs.each { |pair| puts(pair.join(" ")) }
# 解答例1
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map { gets.split.map(&:to_i) }
# 出力
pairs.each { |pair| puts(pair.join(" ")) }
Ruby解答例2

解答例1の整数型の要素数2個の配列を作る部分をわかりやすく書くと次のようになります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例2
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = []
n.times do
# 半角スペースで分割して整数型に変換する
pair = gets.split.map(&:to_i)
# pairs に pair を追加する
pairs.push(pair)
end
# 出力
pairs.each do |pair|
puts(pair.join(" "))
end
# 解答例2 # 1 行目入力 n = gets.to_i # 続く n 行入力 pairs = [] n.times do # 半角スペースで分割して整数型に変換する pair = gets.split.map(&:to_i) # pairs に pair を追加する pairs.push(pair) end # 出力 pairs.each do |pair| puts(pair.join(" ")) end
# 解答例2
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = []
n.times do
  # 半角スペースで分割して整数型に変換する
  pair = gets.split.map(&:to_i)
  # pairs に pair を追加する
  pairs.push(pair)
end
# 出力
pairs.each do |pair|
  puts(pair.join(" "))
end
Python解答例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = [[*map(int, input().split())] for _ in range(n)]
# 出力
[print(*pair) for pair in pairs]
# 解答例 # 1 行目入力 n = int(input()) # 続く n 行入力 pairs = [[*map(int, input().split())] for _ in range(n)] # 出力 [print(*pair) for pair in pairs]
# 解答例
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = [[*map(int, input().split())] for _ in range(n)]
# 出力
[print(*pair) for pair in pairs]

 


9-STEP3: 整数の組からの選択 (paizaランク D 相当)

1行目で要素数nが与えられ、続くn行の半角スペース区切りのペアのデータを整数型に変換して受け取り、8番目のペアを出力する問題です。

入出力例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 入出力例
INPUT1 = <<~"EOS"
10
813 813
8 13
81 1
81 3
8 813
8 138
813 8
83 18
8 13
88 88
EOS
OUTPUT1 = <<~"EOS"
83 18
EOS
# 入出力例 INPUT1 = <<~"EOS" 10 813 813 8 13 81 1 81 3 8 813 8 138 813 8 83 18 8 13 88 88 EOS OUTPUT1 = <<~"EOS" 83 18 EOS
# 入出力例
INPUT1 = <<~"EOS"
  10
  813 813
  8 13
  81 1
  81 3
  8 813
  8 138
  813 8
  83 18
  8 13
  88 88
EOS
OUTPUT1 = <<~"EOS"
  83 18
EOS
Ruby解答例

1行目でデータ数nを受け取り、続くn行の文字列を半角スペースで分割し、整数型の要素数2個の配列にして、配列aryへ格納し、8個目のペアを出力しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
t = 8
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map { gets.split.map(&:to_i) }
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
puts(pair.join(" "))
# 解答例 t = 8 # 1 行目入力 n = gets.to_i # 続く n 行入力 pairs = n.times.map { gets.split.map(&:to_i) } # t 個目の要素を参照 pair = pairs[t - 1] # 出力 puts(pair.join(" "))
# 解答例
t = 8
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map { gets.split.map(&:to_i) }
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
puts(pair.join(" "))
Python解答例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
t = 8
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = [[*map(int, input().split())] for _ in range(n)]
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
print(*pair)
# 解答例 t = 8 # 1 行目入力 n = int(input()) # 続く n 行入力 pairs = [[*map(int, input().split())] for _ in range(n)] # t 個目の要素を参照 pair = pairs[t - 1] # 出力 print(*pair)
# 解答例
t = 8
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = [[*map(int, input().split())] for _ in range(n)]
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
print(*pair)

 


9-STEP4: 文字列と整数の組の入力 (paizaランク D 相当)

1行目で要素数nが与えられ、続くn行の半角スペース区切りのペアのデータの1個目の要素を文字列2個目の要素を整数型に変換して受け取り、先頭から順番に出力する問題です。

入出力例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 入出力例
INPUT1 = <<~"EOS"
5
paiza 813
pa 81
8pa 13
iza 8
pa 13
EOS
OUTPUT1 = <<~"EOS"
paiza 813
pa 81
8pa 13
iza 8
pa 13
EOS
# 入出力例 INPUT1 = <<~"EOS" 5 paiza 813 pa 81 8pa 13 iza 8 pa 13 EOS OUTPUT1 = <<~"EOS" paiza 813 pa 81 8pa 13 iza 8 pa 13 EOS
# 入出力例
INPUT1 = <<~"EOS"
  5
  paiza 813
  pa 81
  8pa 13
  iza 8
  pa 13
EOS
OUTPUT1 = <<~"EOS"
  paiza 813
  pa 81
  8pa 13
  iza 8
  pa 13
EOS
Ruby解答例1

1行目でデータ数nを受け取り、続くn行の文字列を半角スペースで分割し、2個目の要素を整数型に変換した配列にして、配列aryへ格納し、先頭から順に出力しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map do
s, a = gets.split
[s, a.to_i]
end
# 出力
pairs.each { |pair| puts(pair.join(" ")) }
# 解答例 # 1 行目入力 n = gets.to_i # 続く n 行入力 pairs = n.times.map do s, a = gets.split [s, a.to_i] end # 出力 pairs.each { |pair| puts(pair.join(" ")) }
# 解答例
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map do
  s, a = gets.split
  [s, a.to_i]
end
# 出力
pairs.each { |pair| puts(pair.join(" ")) }
Python解答例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = []
for _ in range(n):
s, a = input().split()
pairs.append([s, int(a)])
# 出力
[print(*pair) for pair in pairs]
# 解答例 # 1 行目入力 n = int(input()) # 続く n 行入力 pairs = [] for _ in range(n): s, a = input().split() pairs.append([s, int(a)]) # 出力 [print(*pair) for pair in pairs]
# 解答例
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = []
for _ in range(n):
    s, a = input().split()
    pairs.append([s, int(a)])
# 出力
[print(*pair) for pair in pairs]

 


9-FINAL: 【組になったデータの入力】文字列と整数の組からの選択 (paizaランク D 相当)

1行目で要素数nが与えられ、続くn行の半角スペース区切りのペアのデータの1個目の要素を文字列2個目の要素を整数型に変換して受け取り、8番目のペアを出力する問題です

入出力例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 入出力例
INPUT1 = <<~"EOS"
10
paiza 813
pa 81
8pa 13
iza 8
pa 13
pai 3
zi 8
pp 33
pa 8
pa 138
EOS
OUTPUT1 = <<~"EOS"
pp 33
EOS
# 入出力例 INPUT1 = <<~"EOS" 10 paiza 813 pa 81 8pa 13 iza 8 pa 13 pai 3 zi 8 pp 33 pa 8 pa 138 EOS OUTPUT1 = <<~"EOS" pp 33 EOS
# 入出力例
INPUT1 = <<~"EOS"
  10
  paiza 813
  pa 81
  8pa 13
  iza 8
  pa 13
  pai 3
  zi 8
  pp 33
  pa 8
  pa 138
EOS
OUTPUT1 = <<~"EOS"
  pp 33
EOS
Ruby解答例1

1行目でデータ数nを受け取り、続くn行の文字列を半角スペースで分割し、2個目の要素を整数型に変換した配列にして、配列aryへ格納し、8番目のペアを出力しています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
t = 8
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map do
s, a = gets.split
[s, a.to_i]
end
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
puts(pair.join(" "))
# 解答例 t = 8 # 1 行目入力 n = gets.to_i # 続く n 行入力 pairs = n.times.map do s, a = gets.split [s, a.to_i] end # t 個目の要素を参照 pair = pairs[t - 1] # 出力 puts(pair.join(" "))
# 解答例
t = 8
# 1 行目入力
n = gets.to_i
# 続く n 行入力
pairs = n.times.map do
  s, a = gets.split
  [s, a.to_i]
end
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
puts(pair.join(" "))
Python解答例
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 解答例
t = 8
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = []
for _ in range(n):
s, a = input().split()
pairs.append([s, int(a)])
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
print(*pair)
# 解答例 t = 8 # 1 行目入力 n = int(input()) # 続く n 行入力 pairs = [] for _ in range(n): s, a = input().split() pairs.append([s, int(a)]) # t 個目の要素を参照 pair = pairs[t - 1] # 出力 print(*pair)
# 解答例
t = 8
# 1 行目入力
n = int(input())
# 続く n 行入力
pairs = []
for _ in range(n):
    s, a = input().split()
    pairs.append([s, int(a)])
# t 個目の要素を参照
pair = pairs[t - 1]
# 出力
print(*pair)

今回のまとめ

    • 半角スペースで区切られたペアの値を受け取る
      • 「整数と整数」のペアの場合、.split.map(&:to_i)で整数のペアの配列を作る
      • 「文字列と整数」のペアの場合、.map { s, a = gets.split; [s, a.to_i] } で文字列と整数のペアの配列を作る

ペアのデータも扱うことが多いと思いますのでサクッと書けるように慣れておくと良いかもしれません。

次はラスト、セクション10は「行列」の受け取りです!



【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-paiza, プログラミング
-,

S