回答編集履歴

2

テキスト修正

2018/01/21 16:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -4,193 +4,9 @@
4
4
 
5
5
  いろいろな書き方が出来ると思いますが、考え方の一例として回答します。
6
6
 
7
+ なお入力データは、標準入力から与えるものとしました。
7
8
 
8
9
 
9
- なお入力データは、以下のような内容のテキストファイル `input.txt` で
10
-
11
- 与えられるものとしました。
12
-
13
-
14
-
15
- ```text
16
-
17
- 3
18
-
19
- 1 1 3 8
20
-
21
- 3 2 2 7
22
-
23
- 4 3 8 1
24
-
25
- ```
26
-
27
-
28
-
29
- 以下、思いつきを書いてみました。
30
-
31
-
32
-
33
- ```python
34
-
35
- import re
36
-
37
- from collections import defaultdict
38
-
39
-
40
-
41
- # データ行から、部屋の特定部分と人数との2つをキャプチャする正規表現
42
-
43
- pattern = r"^(.+) (-?\d+)$"
44
-
45
-
46
-
47
- # データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
48
-
49
- counts = defaultdict(lambda: 0)
50
-
51
-
52
-
53
- # 入力ファイルの読み込み
54
-
55
- file = open('input.txt', 'r')
56
-
57
- lines = file.readlines()
58
-
59
- file.close()
60
-
61
-
62
-
63
- # 読み込んだ行の2行目から読み込み
64
-
65
- for line in lines[1:]:
66
-
67
- m = re.match(pattern, line)
68
-
69
- if m:
70
-
71
- counts[m.group(1)] += int(m.group(2))
72
-
73
-
74
-
75
- # 結果の出力
76
-
77
- for building in range(4):
78
-
79
- for floor in range(3):
80
-
81
- counts_of_residents = []
82
-
83
- for room in range(10):
84
-
85
- key = "{0} {1} {2}".format(building+1, floor+1, room+1)
86
-
87
- counts_of_residents.append(counts[key])
88
-
89
-
90
-
91
- print(" ".join(map(lambda n: str(n), counts_of_residents)))
92
-
93
-
94
-
95
- if building < 3:
96
-
97
- print("#" * 20)
98
-
99
-
100
-
101
-
102
-
103
- ```
104
-
105
-
106
-
107
- 上記を実行すると、以下が出力されます。
108
-
109
- ```
110
-
111
- 0 0 8 0 0 0 0 0 0 0
112
-
113
- 0 0 0 0 0 0 0 0 0 0
114
-
115
- 0 0 0 0 0 0 0 0 0 0
116
-
117
- ####################
118
-
119
- 0 0 0 0 0 0 0 0 0 0
120
-
121
- 0 0 0 0 0 0 0 0 0 0
122
-
123
- 0 0 0 0 0 0 0 0 0 0
124
-
125
- ####################
126
-
127
- 0 0 0 0 0 0 0 0 0 0
128
-
129
- 0 7 0 0 0 0 0 0 0 0
130
-
131
- 0 0 0 0 0 0 0 0 0 0
132
-
133
- ####################
134
-
135
- 0 0 0 0 0 0 0 0 0 0
136
-
137
- 0 0 0 0 0 0 0 0 0 0
138
-
139
- 0 0 0 0 0 0 0 1 0 0
140
-
141
- ```
142
-
143
-
144
-
145
- 考え方としては、入力のデータ行
146
-
147
- ```text
148
-
149
- 3 2 2 7
150
-
151
- ```
152
-
153
- を、部屋を特定する文字列`"3 2 2"`と、人数の`7`とに分けて、
154
-
155
- 前者をキーとして、後者を値とする辞書 `counts` に格納することです。
156
-
157
- 辞書にまだないキーに対しては、0 をデフォルト値としたいために、
158
-
159
- `defaultdict` を初期値が 0になるようにして作っています。
160
-
161
-
162
-
163
- なお、問題文には
164
-
165
- > メモリ制限 : 65536 KB
166
-
167
-
168
-
169
- とありますが、入力データがどのくらいの行を含むのか分かりませんので、
170
-
171
- `file.readlines()` でいっぺんに読まないで、一行ごとに読むほうが
172
-
173
- よいかもしれませんが、その点については、アルゴリズムとデータ構造の案を
174
-
175
- 求められているご質問の本題ではないと考え、この回答では`readlines` で
176
-
177
- 入力ファイルを丸ごと読んでいます。
178
-
179
- さらに1行目のデータ行の数は無視するという横着もしています。
180
-
181
-
182
-
183
- 以上参考になれば幸いです。
184
-
185
-
186
-
187
- ---
188
-
189
- **追記**
190
-
191
-
192
-
193
- 他の回答者の皆様の回答に合わせて、以下、標準入力から読み込むバージョンです。
194
10
 
195
11
  ```python
196
12
 
@@ -251,3 +67,79 @@
251
67
 
252
68
 
253
69
  ```
70
+
71
+  
72
+
73
+ 考え方としては、入力のデータ行、たとえば
74
+
75
+ ```text
76
+
77
+ 3 2 2 7
78
+
79
+ ```
80
+
81
+ を、部屋を特定する文字列`"3 2 2"`と、人数の`7`とに分けて、
82
+
83
+ 前者をキーとして、後者を値とする辞書 `counts` に格納する
84
+
85
+ ことにしました。
86
+
87
+ 辞書にまだないキーに対しては、0 をデフォルト値としたいために、
88
+
89
+ `defaultdict` を初期値が 0になるようにして作っています。
90
+
91
+
92
+
93
+ 以下、実行例です。(上記のコードを `count.py` とし、データを`input.txt`に入れました。)
94
+
95
+
96
+
97
+ ```
98
+
99
+ $ cat input.txt
100
+
101
+ 3
102
+
103
+ 1 1 3 8
104
+
105
+ 3 2 2 7
106
+
107
+ 4 3 8 1
108
+
109
+ $ python count.py < input.txt
110
+
111
+ 0 0 8 0 0 0 0 0 0 0
112
+
113
+ 0 0 0 0 0 0 0 0 0 0
114
+
115
+ 0 0 0 0 0 0 0 0 0 0
116
+
117
+ ####################
118
+
119
+ 0 0 0 0 0 0 0 0 0 0
120
+
121
+ 0 0 0 0 0 0 0 0 0 0
122
+
123
+ 0 0 0 0 0 0 0 0 0 0
124
+
125
+ ####################
126
+
127
+ 0 0 0 0 0 0 0 0 0 0
128
+
129
+ 0 7 0 0 0 0 0 0 0 0
130
+
131
+ 0 0 0 0 0 0 0 0 0 0
132
+
133
+ ####################
134
+
135
+ 0 0 0 0 0 0 0 0 0 0
136
+
137
+ 0 0 0 0 0 0 0 0 0 0
138
+
139
+ 0 0 0 0 0 0 0 1 0 0
140
+
141
+ $
142
+
143
+ ```
144
+
145
+ 以上参考になれば幸いです。

1

テキスト修正

2018/01/21 16:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -181,3 +181,73 @@
181
181
 
182
182
 
183
183
  以上参考になれば幸いです。
184
+
185
+
186
+
187
+ ---
188
+
189
+ **追記**
190
+
191
+
192
+
193
+ 他の回答者の皆様の回答に合わせて、以下、標準入力から読み込むバージョンです。
194
+
195
+ ```python
196
+
197
+ import re
198
+
199
+ from collections import defaultdict
200
+
201
+
202
+
203
+ # データ行から、部屋の特定部分と人数との2つをキャプチャする正規表現
204
+
205
+ pattern = r"^(.+) (-?\d+)$"
206
+
207
+
208
+
209
+ # データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
210
+
211
+ counts = defaultdict(lambda: 0)
212
+
213
+
214
+
215
+ # 標準入力からの読み込み
216
+
217
+ for _ in range(int(input())):
218
+
219
+ m = re.match(pattern, input())
220
+
221
+ if m:
222
+
223
+ counts[m.group(1)] += int(m.group(2))
224
+
225
+
226
+
227
+ # 結果の出力
228
+
229
+ for building in range(4):
230
+
231
+ for floor in range(3):
232
+
233
+ counts_of_residents = []
234
+
235
+ for room in range(10):
236
+
237
+ key = "{0} {1} {2}".format(building+1, floor+1, room+1)
238
+
239
+ counts_of_residents.append(str(counts[key]))
240
+
241
+
242
+
243
+ print(" ".join(counts_of_residents))
244
+
245
+
246
+
247
+ if building < 3:
248
+
249
+ print("#" * 20)
250
+
251
+
252
+
253
+ ```