<로직 고민>
- for문을 두 개 돌려서 0이 나오면 숫자를 올리고 1이 나오면 숫자를 내려야지 했는데 답이 이상하게 나와서 다시 읽어보니 1 주변으로 다 안전지대에서 제외되는 거구나...
- 좌우면 몰라도 상하 대각선은 어떻게 찾지..
def solution(board):
zero, one = 0, 0
for i in board:
for j in i:
if j == 0:
zero += 1
elif j == 1:
one += 1
if one > 0:
zero = zero - 8
one = 0
if zero < 0:
zero = 0
return zero
- 이렇게 하니까 한 줄에 여러 1이 있는 경우를 커버하지 못 한다..
- 딱 1번째 예시만 통과함 ㅋㅋ
- 다른 방법이 필요하다..
- 일단 지뢰가 설치된 위치를 찾아야겠다
- 그리고 그 주변..(x-1, y-1), (x-1, y), (x-1, y+1), (x, y-1), (x,y+1), (x+1, y-1), (x+1, y), (x+1, y+1) 을 찾아서 1로 만들어준다
- 근데 지뢰가 보드 경계쪽에 붙어있음 어떻게 그걸 제외시켜주지...?
- 엄청난 if문을 써야할 거 같은데
- 구글링 좀...해봐야겠다
- 딱 내가 생각한대로 푼 사람을 찾았따,,,
- 너무나 컨닝같아서 양심에 찔리지만ㅁ....
- 이 문제로 2시간을 고민했기 때문에 더는 미룰 수 없다..!
- 1로 바꾸는 작업을 할 때 0과 보드의 길이 사이에 있으면 1로 바꾸라는 if문만 있으면 되는 거였다..
- 너무나 간단하군..
<완성된 코드>
def solution(board):
board_len = len(board)
# 지뢰가 설치된 위치 찾기
bomb = []
for x in range(board_len):
for y in range(board_len):
if board[x][y] == 1:
bomb.append((x, y))
# 지뢰 주변을 1로 만들기
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
for x, y in bomb:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < board_len and 0 <= ny < board_len:
board[nx][ny] = 1
# 0인 부분만 카운팅 하기
count = 0
for x in range(board_len):
for y in range(board_len):
if board[x][y] == 0:
count += 1
return count
print(solution([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]])) # 16
print(solution([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0]])) # 13
print(solution([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]])) # 0
<다른 사람 풀이>
- 천재풀이1
def solution(board):
n = len(board)
danger = set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if not x:
continue
danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)
- 사실 한 눈에 딱 이해가 가진 않지만 이 사람 풀이에 댓글이 다 짱이다, 쩐다, 배우고 간다 써있길래 일단 메모 겸 써놓는다
- 오늘은 시간이 많이 지체됐으니 ..내일 와서 보도록 하자..!