[프로그래머스] 안전지대 Lv.0 - [파이썬/python]
https://school.programmers.co.kr/learn/courses/30/lessons/120866
문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 반환(return)하는 문제입니다.
※ 제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
더보기
저는 이 문제를 두 가지 방법으로 풀어보았습니다.
1. 보드에 테두리를 채우고 푸는 방법
2. 보드에 테두리를 채우지 않고 인덱스를 벗어나는지 검사하여 푸는 방법
첫 번째 방법은 n이 커질수록 성능이 떨어지기 때문에 성능 향상을 위해 두 번째 방법으로 제출하였습니다.
하는 방법은 두 가지다 적어놓고 / 코드는 2번째 방법만 적어놓겠습니다.
첫 번째 방법
- 보드의 경계선 테두리 채우기
지뢰가 있는 위치를 찾으면, 해당 위치의 주변 8방향을 검사해야 합니다.
이때 주의할 점은 보드의 경계(인덱스)를 벗어나지 않도록 조건을 검사해야 합니다.
그래서 저는 먼저 테두리를 "X"로 채웠었습니다.
이 때 "X"는 위험지역 및 갈 수 없는 곳을 뜻합니다.n = len(board) # 보드의 크기를 n에 저장합니다. board.insert(0, ["X"] * n) board.append(["X"] * n) for index, row in enumerate(board): board[index] = ["X"] + row + ["X"] 예) # board = [[0,0], [0,0]] # print(board) # 출력 [['X', 'X', 'X', 'X'], ['X', 0, 0, 'X'], ['X', 0, 0, 'X'], ['X', 'X', 'X', 'X']]
- 지뢰 위치 찾기
2중 반복문을 사용하여 보드를 순회하면서 지뢰가 있는 칸(값이 1)을 찾습니다. - 지뢰 주변을 위험 지역으로 표시(인덱스 벗어나는지 검사 필요X)
지뢰를 발견하면 지뢰가 있는 칸 주변 8방향을 검사하여 지뢰가 아닌 경우에는 "X"로 표시합니다.
지뢰는 조건문을 활용하여 그대로 두셔야합니다. 그래야 다음 지뢰에 주변을 "X"를 표시할 수 있습니다.
이렇게 하면 지뢰와 인접한 모든 칸이 위험 지역으로 표시됩니다.
n = len(board) # 보드의 크기를 n에 저장합니다.
# 지뢰의 좌표(y,x)를 이용하여 8방향인 주변 위치 계산
for dy in [-1, 0, 1]:
for dx in [-1, 0, 1]:
ny = y + dy
nx = x + dx
# 해당 위치의 값을 확인하여 지뢰가 아니라면 처리
if board[ny][nx] != 1:
# 처리할 작업 수행()
- 안전한 지역 개수 계산
"X"와 1로 표시된 칸을 제외한 나머지 칸들은 안전한 지역입니다.
따라서 "X"와 1을 제외한 0의 개수를 세어서 안전한 지역의 개수를 계산합니다.
두 번째 방법
- 지뢰 위치 찾기
2중 반복문을 사용하여 보드를 순회하면서 지뢰가 있는 칸(값이 1)을 찾습니다. - 주변 8방향 검사하는 법 (인덱스 벗어나는지 검사 필수O)
지뢰를 발견하면 지뢰가 있는 칸 주변 8방향을 검사하여 지뢰가 아닌 경우에는 "X"로 표시합니다.
이때 주의할 점은 보드의 경계를 벗어나지 않도록 조건을 검사해야 합니다.
지뢰는 조건문을 활용하여 그대로 두셔야합니다. 그래야 다음 지뢰에 주변을 "X"를 표시할 수 있습니다.
이렇게 하면 지뢰와 인접한 모든 칸이 위험 지역으로 표시됩니다.
n = len(board) # 보드의 크기를 n에 저장합니다.
# 지뢰의 좌표(y,x)를 이용하여 8방향인 주변 위치 계산
for dy in [-1, 0, 1]:
for dx in [-1, 0, 1]:
ny = y + dy
nx = x + dx
# 보드 내에 위치하는지 확인
if 0 <= ny < n and 0 <= nx < n:
# 해당 위치의 값을 확인하여 지뢰가 아니라면 처리
if board[ny][nx] != 1:
# 처리할 작업 수행()
- 안전한 지역 개수 계산
"X"와 1로 표시된 칸을 제외한 나머지 칸들은 안전한 지역입니다.
따라서 "X"와 1을 제외한 0의 개수를 세어서 안전한 지역의 개수를 계산합니다.
정답 주의!!!
def solution(board):
n = len(board) # 보드의 크기를 n에 저장합니다.
# 각 칸을 순회하면서 지뢰가 있는 위치를 찾습니다.
for y, row in enumerate(board):
for x, area in enumerate(row):
# 현재 위치에 지뢰가 있으면,
if area == 1:
# 지뢰 주변의 8방향을 검사합니다.
for dy in [-1, 0, 1]:
for dx in [-1, 0, 1]:
ny = y + dy
nx = x + dx
# 검사한 위치가 보드 내에 있고 해당 칸이 지뢰가 아니라면 "X"로 표시합니다.
if 0 <= ny < n and 0 <= nx < n and board[ny][nx] != 1:
board[ny][nx] = "X"
# "X"와 1로 표시된 칸을 제외한 안전한 지역()의 개수를 계산합니다.
safe_area_count = sum([area.count(0) for area in board])
return safe_area_count
728x90
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 카드 뭉치 - Lv.1 (28) | 2023.09.20 |
---|---|
[프로그래머스] 직사각형 넓이 구하기 - Lv.1 (45) | 2023.09.16 |
[프로그래머스] 과일 장수 - Lv.1 (32) | 2023.09.12 |
[프로그래머스] 다트 게임 - Lv.1 (31) | 2023.09.12 |
[프로그래머스] 최소직사각형 - Lv.1 (36) | 2023.09.07 |