반응형
문제링크)
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를 사용하여 범위를 벗어나지 않는 아이디어를 사용하였다.
반응형
'코딩테스트 > Solving exercise' 카테고리의 다른 글
프로그래머스 코딩테스트 입문(lv.0) - 完 (0) | 2023.07.27 |
---|---|
[프로그래머스/Lv.0] 겹치는 선분의 길이 (0) | 2023.07.27 |
[프로그래머스/Lv.0] 옹알이(1) (0) | 2023.07.27 |
[프로그래머스/Lv.0] 가까운 수 (0) | 2023.07.27 |
[프로그래머스/Lv.0] 이진수 더하기 (0) | 2023.07.27 |
댓글