격자의 각 칸은 크기 1의 정사각형 모양이며, 모든 택배 상자는 부피 1의 직육면체 형태이다.
온통 칙칙한 색의 택배 상자들을 보고 따분함을 느낀 포닉스는 택배 상자들을 옮기지 않고
보이는 모든 면에 붉은색 페인트를 칠하려 한다.
이 때, 보이는 면이란 다른 상자 또는 바닥과 닿아있지 않은 면을 말한다.
포닉스가 페인트칠을 마친 후, 어떤 면에도 페인트가 칠해져 있지 않은 택배 상자의 수를 구해 보자.
입력
첫째 줄에 격자의 행의 수 N, 열의 수 M이 주어진다. (1 ≤ N, M ≤ 1000)
이후 둘째 줄부터 N줄에 걸쳐 각 줄에 M개의 수가 주어진다.
i번째 줄의 j번째 수는 i번째 행 j번째 열에 해당하는 칸에 쌓인 택배 상자의 수 Aij이다. (0 ≤ Aij ≤ 109)
출력
페인트칠을 마친 후, 어떤 면에도 페인트가 칠해져 있지 않은 택배 상자의 수를 출력한다.
반응형
풀이
import sys
input = sys.stdin.readline
N, M = map(int, input().rstrip().split())
array = [list(map(int, input().rstrip().split())) for _ in range(N)]
dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]
answer = 0
for y in range(1, N-1):
for x in range(1, M-1):
if array[y][x] == 0:
continue
cur = array[y][x] - 1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if array[ny][nx] < cur:
cur = array[ny][nx]
answer += cur
print(answer)
728x90
일단 문제의 입력값을 받아 각 변수와 배열에 넣어주었다.
문제를 해결하기 위해 조건을 다시 살펴보자.
보이는 모든면에 페인트를 칠한다.
어떤 면에도 페이트가 칠해지지 않은 상자의 수를 구하라.
어떤 면에도 페인트가 칠해지지 않았다는 것은 정육면체의 6면 모두 겉에서 보이지 않는다는 것이다.
그러므로 첫번째 행과 열 마지막 행과 열은 확인 할 필요가 없다.
(가장 바깥쪽 박스이기 때문이다.)
이 조건을 다음과 같이 표현되었다.
for y in range(1, N-1): for x in range(1, M-1):
나머지 배열에 대하여 해당 지점의 동서남북 그리고 자신 - 1 (맨 위의 박스 제외) 중
가장 작은 값을 채택하는 과정을 반복하면 올바른 출력을 도출할 수 있다.
여기까지가 문제 풀이에 대한 아이디어이다.
다음으로 해당 아이디어를 코드로 구현해보자.
가장 중요한 파트인 상하좌우를 확인하는 부분은 해당 코드를 사용하였다.
dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
배열에서 주변의 박스 개수를 확인하며 최소인 값을 확인하는 과정을 거쳤다.
이를 종합하면 다음과 같은 코드가 완성된다.
""" 미완성 코드 """
N, M = map(int, input().rstrip().split())
array = [list(map(int, input().rstrip().split())) for _ in range(N)]
dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]
answer = 0
for y in range(1, N-1):
for x in range(1, M-1):
cur = array[y][x] - 1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if array[ny][nx] < cur:
cur = array[ny][nx]
answer += cur
print(answer)
하지만 코드를 제출해도 통과되지 않는다.
예외처리를 해주지 않았기 때문이다.
현재 지점의 박스 개수에서 -1 한 값을 채택하는 부분이 있는데,
만약 해당 지점의 박스 개수의 초기값이 0이라면 -1로 초기화되는 예외가 발생한다.
예외처리까지 해주면 다음과 같은 코드가 완성된다.
import sys
input = sys.stdin.readline
N, M = map(int, input().rstrip().split())
array = [list(map(int, input().rstrip().split())) for _ in range(N)]
dy = [1, -1, 0, 0]
dx = [0, 0, -1, 1]
answer = 0
for y in range(1, N-1):
for x in range(1, M-1):
if array[y][x] == 0:
continue
cur = array[y][x] - 1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if array[ny][nx] < cur:
cur = array[ny][nx]
answer += cur
print(answer)