본문 바로가기
코딩테스트/Solving exercise

[프로그래머스/Lv.0] 안전지대

by _Bree_ 2023. 7. 27.
반응형

문제링크)

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이)

def solution(board):
    if (len(board) == 1) :
        if board[0][0] == 1:
            return 0
    for i in range(len(board)):
        for j in range(len(board)):
            #젤 위칸 
            if (i == 0) & (board[i][j] == 1):
                #양 끝칸
                if j == 0:
                    #오
                    if board[i][j+1] != 1:
                        board[i][j+1] = 2
                    #아래
                    if board[i+1][j] != 1:
                        board[i+1][j] = 2
                    #아래 옆
                    if board[i+1][j+1] != 1:
                        board[i+1][j+1] = 2
                        
                elif j == (len(board) -1): 
                    #왼
                    if board[i][j-1] != 1:
                        board[i][j-1] = 2
                    #아래
                    if board[i+1][j] != 1:
                        board[i+1][j] = 2
                    #아래 옆
                    if board[i+1][j-1] != 1:
                        board[i+1][j-1] = 2
                else:
                    #왼
                    if board[i][j-1] != 1:
                        board[i][j-1] = 2
                    #오
                    if board[i][j+1] != 1:
                        board[i][j+1] = 2
                    #아래 1
                    if board[i+1][j-1] != 1:
                        board[i+1][j-1] = 2
                    #아래 2
                    if board[i+1][j] != 1:
                        board[i+1][j] = 2
                    #아래 3
                    if board[i+1][j+1] != 1:
                        board[i+1][j+1] = 2
                        
            #젤 밑칸
            elif (i==len(board)-1) & (board[i][j] == 1):
                #양 끝칸
                if j == 0:
                    #오
                    if board[i][j+1] != 1:
                        board[i][j+1] = 2
                    #위
                    if board[i-1][j] != 1:
                        board[i-1][j] = 2
                    #위 오른옆
                    if board[i-1][j+1] != 1:
                        board[i-1][j+1] = 2
                        
                elif j == (len(board) -1): 
                    #왼
                    if board[i][j-1] != 1:
                        board[i][j-1] = 2
                    #위
                    if board[i-1][j] != 1:
                        board[i-1][j] = 2
                    #위 왼옆
                    if board[i-1][j-1] != 1:
                        board[i-1][j-1] = 2
                else:
                    #왼
                    if board[i][j-1] != 1:
                        board[i][j-1] = 2
                    #오
                    if board[i][j+1] != 1:
                        board[i][j+1] = 2
                    #위 1
                    if board[i-1][j-1] != 1:
                        board[i-1][j-1] = 2
                    #위 2
                    if board[i-1][j] != 1:
                        board[i-1][j] = 2
                    #위 3
                    if board[i-1][j+1] != 1:
                        board[i-1][j+1] = 2
                
            #중간 양 끝
            elif (j == 0) & (board[i][j] == 1):
                #위
                if board[i-1][j] != 1:
                    board[i-1][j] = 2
                #위 오른옆
                if board[i-1][j+1] != 1:
                    board[i-1][j+1] = 2
                #오른옆
                if board[i][j+1] != 1:
                    board[i][j+1] = 2
                #아래
                if board[i+1][j] != 1:
                    board[i+1][j] = 2
                #아래 오른옆
                if board[i+1][j+1] != 1:
                    board[i+1][j+1] = 2
            elif (j == len(board)-1) & (board[i][j] == 1):
                #위
                if board[i-1][j] != 1:
                    board[i-1][j] = 2
                #위 왼옆
                if board[i-1][j-1] != 1:
                    board[i-1][j-1] = 2
                #왼옆
                if board[i][j-1] != 1:
                    board[i][j-1] = 2
                #아래
                if board[i+1][j] != 1:
                    board[i+1][j] = 2
                #아래 오른옆
                if board[i+1][j-1] != 1:
                    board[i+1][j-1] = 2
            #나머지 부분(8칸채우기)
            elif (board[i][j] == 1):
                #위
                if board[i-1][j] != 1:
                    board[i-1][j] = 2
                #위 오른옆
                if board[i-1][j+1] != 1:
                    board[i-1][j+1] = 2
                #오른옆
                if board[i][j+1] != 1:
                    board[i][j+1] = 2
                #아래
                if board[i+1][j] != 1:
                    board[i+1][j] = 2
                #아래 오른옆
                if board[i+1][j+1] != 1:
                    board[i+1][j+1] = 2
                #왼옆
                if board[i][j-1] != 1:
                    board[i][j-1] = 2
                #왼위
                if board[i-1][j-1] != 1:
                    board[i-1][j-1] = 2
                #왼아래
                if board[i+1][j-1] != 1:
                    board[i+1][j-1] = 2

    return len(board)**2 - sum(map(lambda x : x.count(2) + x.count(1),board))

for 문을 최대한 안쓰기 위해서 경우의 수를 크게 몇가지로 나누어 제일 윗칸 양끝에 1이 존재할 경우, 제일 아랫칸 양끝에 1이 존재할 경우 , 중간칸 양끝에 1이 존재할 경우, 양끝이 아닌 8칸을 위험지대로 삼을 수 있는 경우를 생각하여 코딩

 

다른 사람 풀이)

def solution(board):
    answer = 0

    for col in range(len(board)):
        for row in range(len(board[col])):
            if board[row][col] == 1:
                for j in range(max(col-1,0),min(col+2,len(board))):
                    for i in range(max(row-1,0),min(row+2,len(board))):
                        if board[i][j] == 1:
                            continue
                        board[i][j] = -1
    for i in board:
        answer += i.count(0)

    return answer

min과 max를 사용하여 범위를 벗어나지 않는 아이디어를 사용하였다. 

반응형

댓글