05의 개발 계발

[페어프로그래밍] 230424 안전지대 | set for if len list range 본문

내일배움캠프 AI/페어프로그래밍

[페어프로그래밍] 230424 안전지대 | set for if len list range

생각하는 코댕이 2023. 4. 24. 22:34
728x90

안전지대


페어프로그래밍 결과 코드

# 페어프로그래밍으로 제작한 코드
def solution(board):
    #한 변의 길이 N과 전체지역 total_zone 
    N=len(board)
    total_zone_count = N**2
    
    # 위험지역을 저장할 리스트    
    list_danger=[]
    for x in range(N):
        for y in range(N):
            if board[x][y] == 1: # 폭탄위치 판별
                list_danger.append((x,y)) # 폭탄위치 저장
                list_danger.append((x-1,y+1)) # 1시
                list_danger.append((x,y+1)) # 3시
                list_danger.append((x+1,y+1)) # 5시
                list_danger.append((x+1,y)) # 6시
                list_danger.append((x+1,y-1)) # 7시
                list_danger.append((x,y-1)) # 9시
                list_danger.append((x-1,y-1)) # 11시
                list_danger.append((x-1,y)) # 12시
    
    danger_zone = set(list_danger) #중복제거
    dzone = list(danger_zone)
    real_dzone = []
    for z in range(len(dzone)):
        if dzone[z][0] < N and dzone[z][1] < N and dzone[z][0] >= 0 and dzone[z][1] >= 0:
            real_dzone.append(dzone[z])
    danger_zone_count = len(real_dzone)
    safe_zone_count = total_zone_count - danger_zone_count
    return safe_zone_count

팀원의 리팩토링 코드

# 팀원의 또다른 풀이
# max와 min을 활용하여 위험지대지정 , 위험지대의 값을 -1로 변경 후 count(0)로 안전지대카운트
'''
 이때, 위험지대를 -1로 한 이유는,
 board가 <list>로 mutable 하기에 1로 할 경우 11번 코드단에서 다시 걸리게 되므로
 이를 방지하기 위해 다른 값을 사용한 것으로 추측된다.
'''
def solution(board):
    answer = 0

    for y in range(len(board)):
        for x in range(len(board[y])):
        # 이차원 배열의 좌표화
            if board[x][y] == 1:
            # 보드 안에 있는 한 점이 지뢰일 경우
                for j in range(max(y-1,0),min(y+2,len(board))):
                    for i in range(max(x-1,0),min(x+2,len(board))):
                        # 최솟값과 최댓값의 범위
                        if board[i][j] == 1:
                            continue
                        board[i][j] = -1
                        # 지뢰 주변 값들의 위험지대화
    for i in board:
        answer += i.count(0)

    return answer

흠터레스팅 코드

# 1번 | enumerate set 리스트컴플리헨션
'''
+enumerate를 활용해 순서(i,j)를 연산에 활용하였다
+set()에 update로 위험지대를 바로 담아서 set의 특성으로 중복을 제거하였다
+비교연산자(부등호)를 합쳐서 표현하였다
+리스트 컴플리헨션을 잘 활용하였다
-14~15번 코드단에서 사용한 변수명 i,j를 19번 코드단에서 재사용한 부분은 가독성을 조금 해치는 것 같다
'''

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)

시사점 or 새로이 알게된 점

*enumerate 를 연산에 활용해보자.
*리스트 컴프리헨션에서 for문의 중첩 사용을 활용해보자.
*if 문을 필터로 활용하려면 continue를 활용하여 거르는 용도로만 사용해도 된다.
*0 <= i < n 과 같이, 세 개의 인자를 비교하는 부등호 문장도 파이썬은 인식한다!
728x90