Programmers_LV0_안전지대

jkky98·2023년 3월 23일
0

CodingTraining

목록 보기
19/61

지뢰가 하나 존재할 때 위험지대가 될 수 있는 최대의 영역 수는 예시의 그림처럼 8개이다. 만약 지뢰가 모서리 지점에 있다면 위험지대로 변할 수 있는 영역은 3개이다. board의 0으로 처리된 영역을 위험지대로 우선 지뢰의 위치에 기반하여 바꿔 주어야 하므로, for문을 통해 지뢰가 발견된다면(j=1) 바뀔 수 있는 최대 영역의 수인 8개의 경우를 모두 코딩한다.(위험지대로 인식될 경우 -5 연산) 만약 행 방향으로 다음 칸이 없을 경우는 try-except문으로 예외처리 하였으며, 열 방향의 경우 리스트의 특성상 마이너스 값도 인덱싱 조회가 되므로 조회할 인덱스가 마이너스일 경우 예외 처리를 진행했고, 또한 인덱싱 조회를 거쳤더니 해당 영역이 지뢰가 있을 경우 (1일 경우) 또한 예외처리 하였다.

  • 8개 영역에 대한 수정연산 시행(-5)
  • 지뢰가 존재한다면 (해당 행렬 요소가 1일 경우) 예외
  • 행 인덱스 +1 이나 -1했을 때 마이너스가 되거나 최대길이를 초과할 경우 예외처리
  • 열 인덱스 +1 이나 -1 했을 때 마이너스가 되거나 최대길이를 초과할 경우 예외처리

코딩이 조금 더러운 듯 하나 8개의 try-except문을 반복문으로 코딩길이를 줄일 수 있을 듯 하며, -5연산을 누적시키는 것이라, 위험지도에 대한 정도의 표현도 가능하다.

def solution(board):
    count = 0
    for idx1, i in enumerate(board):
        for idx2, j in enumerate(i):
            if j == 1:
                try:
                    if board[idx1-1][idx2-1] != 1 and idx1-1 >= 0 and idx2-1 >= 0:
                        board[idx1-1][idx2-1] -= 5
                except:
                    pass 
                try:
                    if board[idx1-1][idx2] != 1 and idx1-1 >= 0 and idx2 >= 0:
                        board[idx1-1][idx2] -= 5
                except:
                    pass
                try:
                    if board[idx1-1][idx2+1] != 1 and idx1-1 >= 0 and idx2+1 >= 0:
                        board[idx1-1][idx2+1] -= 5
                except:
                    pass
                try:
                    if board[idx1][idx2-1] != 1 and idx1 >= 0 and idx2-1 >= 0:
                        board[idx1][idx2-1] -= 5
                except:
                    pass
                try:
                    if board[idx1][idx2+1] != 1 and idx1 >= 0 and idx2+1 >= 0:
                        board[idx1][idx2+1] -= 5
                except:
                    pass
                try:
                    if board[idx1+1][idx2-1] != 1 and idx1+1 >= 0 and idx2-1 >= 0:
                        board[idx1+1][idx2-1] -= 5
                except:
                    pass
                try:
                    if board[idx1+1][idx2] != 1 and idx1+1 >= 0 and idx2 >= 0:
                        board[idx1+1][idx2] -= 5
                except:
                    pass
                try:
                    if board[idx1+1][idx2+1] != 1 and idx1+1 >= 0 and idx2+1 >= 0:
                        board[idx1+1][idx2+1] -= 5
                except:
                    pass 
    for i in board:
        for j in i:
            if j == 0:
                count += 1
                    
                
    
    return count

profile
자바집사의 거북이 수련법

0개의 댓글