지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는 다.
출력설명
봉우리의 개수를 출력하세요.
입력예제
5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2
출력예제
10
풀이
>> 0으로 초기화한 (n+2)*(n+2) 배열 생성해서 0을 채워준
>> 0인 (n+2)*(n+2) 배열에 i:1,j:1 부터~i:n+1, j:n+1만큼 진짜 값 채워줌
>> top(arr[i-1][j]), bottom(arr[i+1][j]), left(arr[i][j-1]), right(arr[i][j+1]) 와 position(arr[i][j]) 값을 비교해서 큰 값 찾기
* 끝에 0 없는건 if문으로 조건을 만들 수 없음! 연구 필요
import sys
sys.stdin = open('input.txt', 'r')
n = int(input())
arr=[[0]*(n+2) for _ in range(n+2)] #0으로 초기화한 (n+2)*(n+2) 배열 생성
a = [list(map(int, input().split())) for _ in range(n)] #진짜 값이 들어있는 배열
position = 0
count = 0
for i in range(0, n): #0인 (n+2)*(n+2) 배열에 i:1,j:1 부터~i:n+1, j:n+1만큼 진짜 값 채워주기
for j in range(0, n):
arr[i+1][j+1] = a[i][j]
for i in range(1, n+1):
for j in range(1, n+1):
position = arr[i][j]
# top, bottom, left, right 값 비교
if (arr[i-1][j] < position) and (arr[i+1][j] < position) and (arr[i][j-1] < position) and (arr[i][j+1] < position):
print(i, j, ':', position)
count += 1 #카운트 +1
print(count)
선생님 풀이
>> 위, 오른쪽, 아래, 왼쪽 좌표값을 dx, dy를 만들어서 배열에 입력
>> if all( arr[i][j] > arr[i+dx[k]][j+dy[k]] for k in range(4) )를 이용해서 이동하면서 현재값이랑 비교
- arr[i+dx[k]][j+dy[k]] for k in range(4)
- k의 값은 k가 0이면 top(-1, 0), 1이면 right(0, 1), 2이면 bottom(1, 0), 3이면 left(0, -1)
- 이 값이 4번 반복하면서 i, j를 변경시키면서 포지션이 변경된다
import sys
sys.stdin = open('input.txt', 'r')
dx = [-1, 0, 1, 0] #top(-1, 0) right(0, 1) bottom(1, 0) left(0, -1)
dy = [0, 1, 0, -1]
n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
count = 0
#격자의 가장자리는 0으로 초기화 되었다고 가정
arr.insert(0, [0]*n) #첫번째 행에 0을 n개 만큼 삽입하기
arr.append([0]*n) #마지막 행에 0을 n개 만큼 삽입하기
for i in arr:
i.insert(0, 0) #맨 왼쪽(맨앞)에 0 삽입
i.append(0) #맨 오른쪽(맨뒤)에 0 삽입
#★★★★★★★이동 시키면서 비교하기★★★★★★★
for i in range(1, n+1):
for j in range(1, n+1):
#현재 값과 dx, dy 비교(k는 안에 있는 0~3값(-1, 0, 1, 0))
#4번 반복하면서 모두가 참일때 all이 참
if all( arr[i][j] > arr[i+dx[k]][j+dy[k]] for k in range(4) ): #all()은 안에 있는 모든 조건이 참일때 참으로 반환
count += 1
print(count)
'코테풀이 > 인프런 파이썬 알고리즘' 카테고리의 다른 글
탐색&시뮬레이션(string, 1차원, 2차원 리스트 탐색 )_11_격자판 회문수 (0) | 2021.08.11 |
---|---|
탐색&시뮬레이션(string, 1차원, 2차원 리스트 탐색 )_10_스토쿠(스도쿠) 검사 (0) | 2021.08.11 |
탐색&시뮬레이션(string, 1차원, 2차원 리스트 탐색 )_8_곳감(모래시계) (0) | 2021.08.09 |
탐색&시뮬레이션(string, 1차원, 2차원 리스트 탐색 )_7_사과나무(다이아몬드) (0) | 2021.08.06 |
탐색&시뮬레이션(string, 1차원, 2차원 리스트 탐색 )_6_격자판 최대합 (0) | 2021.08.04 |