목차
봉우리
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
▣ 입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는 다.
▣ 출력설명
봉우리의 개수를 출력하세요.
▣ 입력예제 1
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
▣ 출력예제 1
10
나의 코드 1
n=int(input())
arr=[list(map(int,input().split())) for _ in range(n)]
for i in range(n):
arr[i].append(0)
arr[i].insert(0,0)
arr.insert(0,[0]*(n+2))
arr.append([0]*(n+2))
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):
for k in range(4):
nx=i+dx[k]
ny=j+dy[k]
if arr[nx][ny]>=arr[i][j]:
break
else:
print()
print(i,j)
cnt+=1
print(cnt)
나의 코드 2
n=int(input())
arr=[list(map(int,input().split())) for _ in range(n)]
dx=[-1,0,1,0]
dy=[0,1,0,-1]
cnt=0
for i in range(n):
for j in range(n):
for k in range(4):
nx=i+dx[k]
ny=j+dy[k]
if 0<=nx<n and 0<=ny<n and arr[nx][ny]>=arr[i][j]:
break
else:
cnt+=1
print(cnt)
입력받은 좌표 테두리에 0을 씌우고 구현할지 0 않씌우고 구현하지 고민하다 우선 0을 씌우지 않고 나의 코드 2로 구현 하려고 하였다.
하지만 구현하던 와중 출력값이 맞지 않아. 나의 코드 1을 작성을 하게 되었다.
하지만 문제는 0일 씌우고 안씌우고의 문제가 아니라
k변수를 range(3)으로 했었고 ny=i+dy[k]로 해서 문제였다..
뭐 어찌 저찌 둘다 구현하긴 했는데 무히려 좋아~~~~연습되고 조오타~
import sys
#sys.stdin = open("input.txt", 'r')
dx=[-1, 0, 1, 0]
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:
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)):
cnt+=1
print(cnt)
all함수를 사용하여 구현된 코드이다.!
코드량이 확 준게 보인다..! 좋은 코드인듯 아직 all을 주로 사용하진 않았지만 기억해두면 좋을것 같다
'코딩테스트[파이썬] > 알고리즘 문제풀이 입문' 카테고리의 다른 글
[탐색&시물레이션] - 격자판 회문수 (2) | 2024.02.06 |
---|---|
[탐색 & 시물레이션] - 스도쿠검사 (4) | 2024.02.06 |
[탐색&시물레이션] - 곳감(모래시계) (2) | 2024.02.05 |
[탐색&시물레이션] - 사과나무(다이아몬드) (2) | 2024.02.05 |
[탐색&시물레이션] - 격자판 최대합 (0) | 2024.02.05 |