반응형
문제설명
지도 정보가 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 |