본문 바로가기

알고리즘 삽질장

[인프런] 봉우리

반응형


문제설명

지도 정보가 N by N 격자판에 주어진다. 각 격자에는 그 지역의 높이가 쓰여있다. 각 격자판의 숫자 중 자신의 상,하,좌,우 숫자보다 큰 숫자는 봉우리 지역이다. 봉우리 지역이 몇 개 있는지 알아내는 프로그램을 작성해라. 격자의 가장자리는 0으로 초기화 되었다고 가정한다. 만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개이다.

 

입력조건

  • 첫 줄에 자연수 N(1 <= N <= 50)이 주어진다.
  • 둘째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력조건

  • 봉우리의 개수를 출력한다.

사고과정

  • 주어진 격자판의 가장자리에 0으로 모두 패딩처리하기 위해서 애초에 리스트를 N+2 by N+2 만큼 0으로 초기화 한 후 격자판입력 정보를 늘린 격자판에 갱신시켜주었다.
  • 그리고 상,하,좌,우를 보면서 해당 값이 가장 큰 값이면 카운트해주었다.
  • 강의 풀이를 보니 가장자리에 0으로 패딩시키는 과정을 리스트의 insert, append를 활용해 리스트를 넣어주었다. 
  • 그리고 가장 인상적이었던 점은 상,하,좌,우 조건 넣어줄 때 all 함수를 사용한 것! 참고로 all 함수는 해당 조건을 모두 만족할 때만 True로 나온다, 반대의 성격 함수에는 any 함수가 있다. any 함수는 하나라도 만족하면 True를 반환한다.

풀이

- 나의 풀이

def find(x, y):
    global arr
    tmp = arr[x][y]
    if tmp > arr[x-1][y] and tmp > arr[x+1][y] and tmp > arr[x][y-1] and tmp > arr[x][y+1]:
        return True
    return False
    
n = int(input())
arr = [[0] * (n+2) for _ in range(n+2)]
for i in range(n):
    data = list(map(int, input().split()))
    for j in range(n):
        arr[i+1][j+1] = data[j]
count = 0
for i in range(1, n+1):
    for j in range(1, n+1):
        if find(i, j):
            count += 1
print(count)

- 강의 풀이

# 강의 Solution -> 격자 가장자리 0 추가하는 방법을 insert, append를 활용, 그리고 조건을 all로 사용!
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:
    x.insert(0, 0)
    x.append(0)

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
cnt = 0
for i in range(1, n+1):
    for j in range(1, n+1):
        # all 조건
        if all(a[i][j] > a[i+dx[k]][j+dx[k]] for k in range(4)):
            cnt += 1
print(cnt)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 격자판 회문수  (0) 2021.11.12
[인프런] 스도쿠 검사  (0) 2021.11.12
[인프런] 곳감(모래시계)  (0) 2021.11.12
[인프런] 사과나무(다이아몬드)  (0) 2021.11.12
[BOJ] 1748번 - 수 이어 쓰기 1  (0) 2021.11.05