回答編集履歴
2
テキスト修正
answer
CHANGED
@@ -1,19 +1,8 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
3
|
いろいろな書き方が出来ると思いますが、考え方の一例として回答します。
|
4
|
+
なお入力データは、標準入力から与えるものとしました。
|
4
5
|
|
5
|
-
なお入力データは、以下のような内容のテキストファイル `input.txt` で
|
6
|
-
与えられるものとしました。
|
7
|
-
|
8
|
-
```text
|
9
|
-
3
|
10
|
-
1 1 3 8
|
11
|
-
3 2 2 7
|
12
|
-
4 3 8 1
|
13
|
-
```
|
14
|
-
|
15
|
-
以下、思いつきを書いてみました。
|
16
|
-
|
17
6
|
```python
|
18
7
|
import re
|
19
8
|
from collections import defaultdict
|
@@ -24,14 +13,9 @@
|
|
24
13
|
# データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
|
25
14
|
counts = defaultdict(lambda: 0)
|
26
15
|
|
27
|
-
# 入力
|
16
|
+
# 標準入力からの読み込み
|
28
|
-
file = open('input.txt', 'r')
|
29
|
-
lines = file.readlines()
|
30
|
-
file.close()
|
31
|
-
|
32
|
-
# 読み込んだ行の2行目から読み込み
|
33
|
-
for
|
17
|
+
for _ in range(int(input())):
|
34
|
-
m = re.match(pattern,
|
18
|
+
m = re.match(pattern, input())
|
35
19
|
if m:
|
36
20
|
counts[m.group(1)] += int(m.group(2))
|
37
21
|
|
@@ -41,18 +25,34 @@
|
|
41
25
|
counts_of_residents = []
|
42
26
|
for room in range(10):
|
43
27
|
key = "{0} {1} {2}".format(building+1, floor+1, room+1)
|
44
|
-
counts_of_residents.append(counts[key])
|
28
|
+
counts_of_residents.append(str(counts[key]))
|
45
29
|
|
46
|
-
print(" ".join(
|
30
|
+
print(" ".join(counts_of_residents))
|
47
31
|
|
48
32
|
if building < 3:
|
49
33
|
print("#" * 20)
|
50
34
|
|
51
|
-
|
52
35
|
```
|
36
|
+
|
37
|
+
考え方としては、入力のデータ行、たとえば
|
38
|
+
```text
|
39
|
+
3 2 2 7
|
40
|
+
```
|
41
|
+
を、部屋を特定する文字列`"3 2 2"`と、人数の`7`とに分けて、
|
42
|
+
前者をキーとして、後者を値とする辞書 `counts` に格納する
|
43
|
+
ことにしました。
|
44
|
+
辞書にまだないキーに対しては、0 をデフォルト値としたいために、
|
45
|
+
`defaultdict` を初期値が 0になるようにして作っています。
|
53
46
|
|
54
|
-
|
47
|
+
以下、実行例です。(上記のコードを `count.py` とし、データを`input.txt`に入れました。)
|
48
|
+
|
55
49
|
```
|
50
|
+
$ cat input.txt
|
51
|
+
3
|
52
|
+
1 1 3 8
|
53
|
+
3 2 2 7
|
54
|
+
4 3 8 1
|
55
|
+
$ python count.py < input.txt
|
56
56
|
0 0 8 0 0 0 0 0 0 0
|
57
57
|
0 0 0 0 0 0 0 0 0 0
|
58
58
|
0 0 0 0 0 0 0 0 0 0
|
@@ -68,60 +68,6 @@
|
|
68
68
|
0 0 0 0 0 0 0 0 0 0
|
69
69
|
0 0 0 0 0 0 0 0 0 0
|
70
70
|
0 0 0 0 0 0 0 1 0 0
|
71
|
+
$
|
71
72
|
```
|
72
|
-
|
73
|
-
考え方としては、入力のデータ行
|
74
|
-
```text
|
75
|
-
3 2 2 7
|
76
|
-
```
|
77
|
-
を、部屋を特定する文字列`"3 2 2"`と、人数の`7`とに分けて、
|
78
|
-
前者をキーとして、後者を値とする辞書 `counts` に格納することです。
|
79
|
-
辞書にまだないキーに対しては、0 をデフォルト値としたいために、
|
80
|
-
`defaultdict` を初期値が 0になるようにして作っています。
|
81
|
-
|
82
|
-
なお、問題文には
|
83
|
-
> メモリ制限 : 65536 KB
|
84
|
-
|
85
|
-
とありますが、入力データがどのくらいの行を含むのか分かりませんので、
|
86
|
-
`file.readlines()` でいっぺんに読まないで、一行ごとに読むほうが
|
87
|
-
よいかもしれませんが、その点については、アルゴリズムとデータ構造の案を
|
88
|
-
求められているご質問の本題ではないと考え、この回答では`readlines` で
|
89
|
-
入力ファイルを丸ごと読んでいます。
|
90
|
-
さらに1行目のデータ行の数は無視するという横着もしています。
|
91
|
-
|
92
|
-
以上参考になれば幸いです。
|
73
|
+
以上参考になれば幸いです。
|
93
|
-
|
94
|
-
---
|
95
|
-
**追記**
|
96
|
-
|
97
|
-
他の回答者の皆様の回答に合わせて、以下、標準入力から読み込むバージョンです。
|
98
|
-
```python
|
99
|
-
import re
|
100
|
-
from collections import defaultdict
|
101
|
-
|
102
|
-
# データ行から、部屋の特定部分と人数との2つをキャプチャする正規表現
|
103
|
-
pattern = r"^(.+) (-?\d+)$"
|
104
|
-
|
105
|
-
# データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
|
106
|
-
counts = defaultdict(lambda: 0)
|
107
|
-
|
108
|
-
# 標準入力からの読み込み
|
109
|
-
for _ in range(int(input())):
|
110
|
-
m = re.match(pattern, input())
|
111
|
-
if m:
|
112
|
-
counts[m.group(1)] += int(m.group(2))
|
113
|
-
|
114
|
-
# 結果の出力
|
115
|
-
for building in range(4):
|
116
|
-
for floor in range(3):
|
117
|
-
counts_of_residents = []
|
118
|
-
for room in range(10):
|
119
|
-
key = "{0} {1} {2}".format(building+1, floor+1, room+1)
|
120
|
-
counts_of_residents.append(str(counts[key]))
|
121
|
-
|
122
|
-
print(" ".join(counts_of_residents))
|
123
|
-
|
124
|
-
if building < 3:
|
125
|
-
print("#" * 20)
|
126
|
-
|
127
|
-
```
|
1
テキスト修正
answer
CHANGED
@@ -89,4 +89,39 @@
|
|
89
89
|
入力ファイルを丸ごと読んでいます。
|
90
90
|
さらに1行目のデータ行の数は無視するという横着もしています。
|
91
91
|
|
92
|
-
以上参考になれば幸いです。
|
92
|
+
以上参考になれば幸いです。
|
93
|
+
|
94
|
+
---
|
95
|
+
**追記**
|
96
|
+
|
97
|
+
他の回答者の皆様の回答に合わせて、以下、標準入力から読み込むバージョンです。
|
98
|
+
```python
|
99
|
+
import re
|
100
|
+
from collections import defaultdict
|
101
|
+
|
102
|
+
# データ行から、部屋の特定部分と人数との2つをキャプチャする正規表現
|
103
|
+
pattern = r"^(.+) (-?\d+)$"
|
104
|
+
|
105
|
+
# データ行を読み込み、人数をカウントしておく辞書(デフォルト値: 0)
|
106
|
+
counts = defaultdict(lambda: 0)
|
107
|
+
|
108
|
+
# 標準入力からの読み込み
|
109
|
+
for _ in range(int(input())):
|
110
|
+
m = re.match(pattern, input())
|
111
|
+
if m:
|
112
|
+
counts[m.group(1)] += int(m.group(2))
|
113
|
+
|
114
|
+
# 結果の出力
|
115
|
+
for building in range(4):
|
116
|
+
for floor in range(3):
|
117
|
+
counts_of_residents = []
|
118
|
+
for room in range(10):
|
119
|
+
key = "{0} {1} {2}".format(building+1, floor+1, room+1)
|
120
|
+
counts_of_residents.append(str(counts[key]))
|
121
|
+
|
122
|
+
print(" ".join(counts_of_residents))
|
123
|
+
|
124
|
+
if building < 3:
|
125
|
+
print("#" * 20)
|
126
|
+
|
127
|
+
```
|