[Algorithm] 봉우리

myeonji·2022년 1월 20일
0

Algorithm

목록 보기
11/89

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.

<내 답안>

n = int(input())
# 먼저 (n+1 * n+1) 리스트를 전부 0으로 초기화 한다.
tot = [[0 for _ in range(n+2)] for _ in range(n+2)]

for i in range(1, n+1):
    list1 = list(map(int, input().split()))
    for j in range(0, n):
        tot[i][j+1] = list1[j]

cnt = 0
for i in range(1, n+1):
    for j in range(1, n+1):
        if max(tot[i-1][j], tot[i+1][j], tot[i][j-1], tot[i][j+1]) < tot[i][j]:
            cnt += 1

print(cnt)

나는 처음부터 가장자리를 포함한 리스트를 0으로 초기화 하였다.
그 다음 가장자리를 제외한 인덱스 1부터 n까지 입력받은 값으로 바꾸었다.
그리고 상하좌우 비교는 상하좌우를 하나하나 작성해주었다.

<모범답안>

dx = [-1, 0, 1, 0]  # 상하좌우 풀 때 dx, dy 리스트 초기화 하여 푸는 방법
dy = [0, 1, 0, -1]

n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
a.insert(0, [0]*n)
a.append([0]*n)

for x in a:  # 각 행마다 맨 앞과 맨 뒤에 0 넣기
    x.insert(0, 0)
    x.append(0)

cnt = 0
for i in range(1, n+1):
    for j in range(1, n+1):
        if all(a[i][j]>a[i+dx[k]][j+dy[k]] for k in range(4)):  # all은 모두 참일 때 True
            cnt+=1

print(cnt)

네 방향(상하좌우)에 관한 문제를 풀 때 위의 코드와 같이 dx, dy 리스트를 초기화 시켜놓고 풀면 편하다고(?) 하셨다.

이게 어떻게 사용되나 봤더니 기준값을 a[i][j]=5 라고 하면 i에는 dx를, j에는 dy를 사용하는 것이었다. 인덱스를 나타내는 i, j가 1일 때, a[i+dx[k]]는 a[1+(-1)], a[1+0], a[1+1], a[1+0] 일 것이고 a[i+dy[k]]는 a[1+0], a[1+1], a[1+0], a[1+(-1)] 이다.

따라서 합쳐보면 a[1+(-1)][1+0], a[1+0][1+1], a[1+1][1+0], a[1+0][1+(-1)] = a[0][1], a[1][2], a[2][1], a[1][0] 이 상하좌우가 된다.

이것은 a[i][j]=a[1][1]의 상하좌우와 일치한다!

0개의 댓글