게시판
검색 결과: 52
다음 검색 용어는 이 메시지의 HTML 마크업에서만 나타납니다. 23.7
이걸 참고해서 Thonny에서 실행해보세요.
한 단계씩 실행할 수도 있고, 오른쪽 위에처럼 변수의 값을 볼 수도 있습니다.
print(i+x, j+y)를 출력했는데, 0 3을 출력했을 때 list index out of range 상태인 것을 알 수 있습니다.
입력은 3 3으로 했습니다. 그러니까 x, y의 인덱스는 각각 0, 1, 2만 접근할 수 있습니다. 3은 접근하면 안 됩니다.
단계별로 접근하면서 [0, 0, '.']인 상태인데 이건 업데이트하지 못했습니다.
(0, 2)가 정확한 좌표일 겁니다. 하지만 코드에서는 (0, 3)에 접근하려고 하고, 이는 범위를 벗어났기 때문에 list index out of range 오류가 발생합니다.
에러 메시지로 line 21로 되어 있는데, matrix[0][3]에 접근하려고 해서 발생하는 문제입니다.
따라서 경계 조건을 좀 더 체크해서 경계를 벗어나지 않게 해야 합니다.
심사문제를 통과했기 때문에 풀이에는 문제가 없습니다.
풀이 방식은 여러 가지가 있을 수 있습니다.
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 제어 흐름을 쓰는 게 바람직합니다. 예외를 발생시키지 않기 때문에 더 빠르게 처리됩니다.
참고하세요.
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를 돌려준다 라고 이해해도 괜찮은 것일까요?
https://dojang.io/mod/forum/discuss.php?d=1041
시각화 사이트를 이용하면 좋습니다.
Thonny를 설치하고 단계별로 실행해도 마찬가지로 볼 수 있습니다. 상단 고정에 링크 있습니다.
포럼 상단 오른쪽에 23.7로 검색하면 이전 질문과 답변을 참조할 수 있습니다.
https://dojang.io/mod/forum/discuss.php?d=1778&parent=4036
이전 답변 중에 이걸 이용하면 시각화해서 단계별로 실행하는 걸 볼 수 있습니다.
물론 이것도 질문자의 코드라서 정상 동작하지는 않지만, 다른 사람이 작성한 방식도 분석해보면 도움이 됩니다.
종이와 펜을 꺼내서 생각을 정리하고 메모하면서 하는 게 좋습니다.
모니터만 쳐다보면서 눈으로 하려고 하면 안 됩니다.
종이와 펜으로 정리해봐야 이해 못 한게 보입니다.
공지에 있는 사이트를 이용하세요.
입력 받는 부분은
3 3
...
...
..*
이렇게 해당하는 데이터를 변수에 넣고
단계별로 실행하면서 결과를 살펴보세요.
그러면 잘못된 게 보입니다.
안녕하세요.
코딩도장을 보고 파이썬에 취미를 가져보려는 직딩입니다.
지뢰찾기 문제를 몇시간 고심해서 만들어봤습니다.
작동은 되는데 심사에 통과되지 못해서 어떤게 잘못되었는지
궁금해서 문의드립니다.
문의한 코드는 삭제합니다.
(도장_ 관리자님이 수정함 - 원문 제출일: 월요일, 18 10월 2021, 12:32 오후)
맞게 풀이했습니다.
다만 심사문제는 텍스트 일치로 판단합니다.
예를 들어 심사문제가 원하는 정답이
Hello
인데
제출한 코드의 결과가
Hello
이면 오답으로 처리됩니다.
출력하는 부분을 개선해서 제출하면 됩니다.