1+ import sys
2+ answer = 0
3+ N , M = map (int , sys .stdin .readline ().split ())
4+ board = [[] for _ in range (N )]
5+ # E와 M의 누적합 행렬 정의
6+ e_sum = [[0 ]* M for _ in range (N )]
7+ m_sum = [[0 ]* M for _ in range (N )]
8+
9+ for i in range (N ):
10+ board [i ] = list (sys .stdin .readline ()[:- 1 ])
11+ for j in range (M ):
12+ if board [i ][j ] == "E" :
13+ e_sum [i ][j ] = 1
14+ elif board [i ][j ] == "M" :
15+ m_sum [i ][j ] = 1
16+
17+ # 2.E와 M 행렬 누적합 계산하기
18+ # dp[i][j] = dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1 + value[i][j]
19+ for i in range (N ):
20+ for j in range (M ):
21+ # E의 누적합 계산
22+ # i=0 or j=0 일때 누적합 점화식
23+ if i == 0 and j == 0 :
24+ e_sum [0 ][0 ] = e_sum [0 ][0 ]
25+ elif i == 0 : # 가로형 누적합 계산식 :
26+ e_sum [i ][j ] = e_sum [0 ][j - 1 ]+ e_sum [0 ][j ]
27+ elif j == 0 : # 세로형 누적합 계산식
28+ e_sum [i ][j ] = e_sum [i ][0 ] + e_sum [i - 1 ][0 ]
29+ else : # 일반적인 누적합 계산식
30+ e_sum [i ][j ] = e_sum [i - 1 ][j ] + e_sum [i ][j - 1 ] - e_sum [i - 1 ][j - 1 ] + e_sum [i ][j ]
31+
32+ #M의 누적합 계산 : E의 누적합의 역방향(아래로 뒤집기)
33+ # 기준(i,j) : 왼쪽 위쪽 칸
34+ for i in range (N - 1 , - 1 , - 1 ):
35+ for j in range (M - 1 , - 1 ,- 1 ) :
36+ # i=0 or j=0 일때 누적합 점화식
37+ if i == N - 1 and j == M - 1 : # 맨 오른쪽 아래 칸의 누적합
38+ m_sum [i ][j ] = m_sum [i ][j ]
39+ elif i == N - 1 : # 가로형 누적합 계산식 :
40+ m_sum [i ][j ] = m_sum [i ][j + 1 ]+ m_sum [i ][j ]
41+ elif j == M - 1 : # 세로형 누적합 계산식
42+ m_sum [i ][j ] = m_sum [i ][j ] + m_sum [i + 1 ][j ]
43+ else : # 일반적인 누적합 계산식
44+ m_sum [i ][j ] = m_sum [i + 1 ][j ] + m_sum [i ][j + 1 ] - m_sum [i + 1 ][j + 1 ] + m_sum [i ][j ]
45+
46+ #3. S 을 기준으로 총 경우의 수 구하기
47+ # 경우의 수 = E*M
48+ answer = 0
49+ for y in range (N ):
50+ for x in range (M ):
51+ # S 의 위치 파악하기
52+ if board [y ][x ] == "S" :
53+ # (y,x) 인 S의 기준에서 E*M 으로 경우의 수 구하기
54+ answer += e_sum [y ][x ]* m_sum [y ][x ]
55+
56+
57+ #4. 나머지로 출력하기
58+ print (answer % (10 ** 9 + 7 ))
0 commit comments