col, row = map(int,input().split()) #가로 세로 값 입력
matrix = []
for i in range(row): #필요한 데이터 입력
matrix.append(list(input()))
for i in range(row): #*근처 +1 함수
for j in range(col):
if matrix[i][j] == "*" :
#a
try:
if matrix[i-1][j-1] == "." and i-1 != -1 and j-1 != -1:
matrix[i-1][j-1] = 1
elif type(matrix[i-1][j-1]) == int and i-1 != -1 and j-1 != -1:
matrix[i-1][j-1] += 1
except:
pass
#b
try:
if matrix[i-1][j] == "." and i-1 != -1:
matrix[i-1][j] = 1
elif type(matrix[i-1][j]) == int and i-1 != -1:
matrix[i-1][j] += 1
except:
pass
#c
try:
if matrix[i-1][j+1] == "." and i-1 != -1:
matrix[i-1][j+1] = 1
elif type(matrix[i-1][j+1]) == int and i-1 != -1:
matrix[i-1][j+1] += 1
except:
pass
#d
try:
if matrix[i][j-1] == "." and j-1 != -1:
matrix[i][j-1] = 1
elif type(matrix[i][j-1]) == int and j-1 != -1:
matrix[i][j-1] += 1
except:
pass
#f
try:
if matrix[i][j+1] == ".":
matrix[i][j+1] = 1
elif type(matrix[i][j+1]) == int:
matrix[i][j+1] += 1
except:
pass
#g
try:
if matrix[i+1][j-1] == "." and j-1 != -1:
matrix[i+1][j-1] = 1
elif type(matrix[i+1][j-1]) == int and j-1 != -1:
matrix[i+1][j-1] += 1
except:
pass
#h
try:
if matrix[i+1][j] == ".":
matrix[i+1][j] = 1
elif type(matrix[i+1][j]) == int:
matrix[i+1][j] += 1
except:
pass
#i
try:
if matrix[i+1][j+1] == ".":
matrix[i+1][j+1] = 1
elif type(matrix[i+1][j+1]) == int:
matrix[i+1][j+1] += 1
except:
pass
for i in range(row): #후처리 .을 0으로 바꾸는 작업
for j in range(col):
if matrix[i][j] == '.' :
matrix[i][j] = 0
for i in range(row):
for j in range(col):
print(matrix[i][j] ,end = '')
print()
중간중간 오류가 너무많이나와서 계속 확인하며 수정한다고 누더기 처럼 코드가 더러운점 양해 부탁드립니다.
제가 풀었을때 이중 for roop 으로 *이 나올때마다 근처에 +1을 더해주는 방식으로 생각해서 코딩을 하였습니다.
하지만 풀이 방식은 제가 이해한것으로는,
1. .을 0으로 바꿔준다.
2. 그 후 *가 발견되면 i-1~i+1, j-1~j+1 범주에 +1을 해준다.
인듯 싶은데요, 설명한 방식은 제가 적은 방식에서
한번 더 이중 for roop를 돌려준다 라고 이해해도 괜찮은 것일까요?
심사문제를 통과했기 때문에 풀이에는 문제가 없습니다.
풀이 방식은 여러 가지가 있을 수 있습니다.
4중첩 루프는 필연입니다. 계산량이 많습니다.
100x100 크기에서 3x3로 계산을 해야 하기 때문에 4중첩 루프가 됩니다. 계산량이 많습니다.
실제로 컴퓨터 그래픽(영상 처리), 딥 러닝 등은 모두 이러한 행렬 연산을 이용합니다. 행렬 연산을 매우 많이 합니다.
풀 HD 화면이 1920*1080 해상도입니다. 1픽셀이라면
1920*1080 = 2,073,600
약 207만 번의 계산이 필요합니다. 하지만 이건 흑백이죠. 칼라라면 24비트 칼라이면 24비트 = 3바이트이고, 32비트 칼라이면 4바이트이죠.
207 * 4 = 828만 번의 연산이 필요합니다.
CPU 코어는 요즘도 8코어 전후입니다. 8개의 코어로 나눠서 계산해도 한참 걸리겠죠?
그래픽 카드는 보통 1024~2048개의 코어가 달려있습니다. 더 많은 제품도 있죠. 각각의 성능은 작지만, RGB 색상 값의 범위는 0~255이니 작은 수를 많이 계산할 수만 있으면 됩니다.
지뢰찾기는 이러한 행렬 연산의 기초 연습입니다.
문제에서 제대로 푸는 방식은 심사문제 제출 시에 볼 수 있는 해설에도 있지만, continue를 사용하는 것입니다. 흐름 제어를 사용할 수 있느냐입니다.
해당 코드의 문제 풀이는 except와 pass를 사용해서 continue를 흉내낸 것으로 보입니다. 이것도 풀이 방법의 하나가 될 수 있습니다.
다만, 예외는 CPU 시간을 많이 사용합니다. 따라서 대규모 행렬 처리라면 바람직하지 않은 코드입니다. 물론 의도한 동작은 완수했고, 심사는 통과했습니다. 그러나 보다 나은 코드라면 continue 제어 흐름을 쓰는 게 바람직합니다. 예외를 발생시키지 않기 때문에 더 빠르게 처리됩니다.
참고하세요.