teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

テキスト修正

2018/01/21 16:53

投稿

jun68ykt
jun68ykt

スコア9058

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 line in lines[1:]:
17
+ for _ in range(int(input())):
34
- m = re.match(pattern, line)
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(map(lambda n: str(n), counts_of_residents)))
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

テキスト修正

2018/01/21 16:53

投稿

jun68ykt
jun68ykt

スコア9058

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
+ ```