코딩 테스트 문제 풀이
문제 이름 : 봉우리
지도 정보가 N*N 격자판이 주어진다. 격자판에 있는 숫자 중 상하좌우에 있는 숫자보다 큰 숫자는 봉우리 지역인데 이 봉우리 지역이 몇 개인지 구하라.
격자의 가장 자리는 0으로 초기화가 되어 있다고 가정한다.
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
dx=[-1, 0, 1, 0]
dy=[0, 1, 0, -1]
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)
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
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
NN의 격자판에서 N의 값을 받아오기 위해 n 변수를 만들었고 a 변수를 리스트로 만들어 n 변수를 통해 NN 격자 판에서 값을 넣을 수 있도록 했다.
a.insert(0, [0]*n)
a.append([0]*n)
insert를 통해 0번 행에 0으로 초기화 된 n개의 값을 삽입하도록 했다.
append를 통해 n번행 마지막 행에 0으로 초기화 된 n개의 값을 넣도록 했다.
→ 이제 특수 조건인 주변을 0으로 초기화 되야 한다는 값 중 맨 위와 맨 아래 줄을 만족시키게 된다.
for x in a:
x.insert(0, 0)
x.append(0)
x는 a라는 2차원 리스트의 한 행이 된다.
x 한 행을 불러와서 맨 처음에 0을 넣어주고 맨 마지막에 0을 넣어준다.
→ 드디어 특수 조건인 주변을 ㅇ으로 초기화 하라를 모두 만족하게 되었다.
dx=[-1, 0, 1, 0]
dy=[0, 1, 0, -1]
중간의 값이 상하좌우와 비교했을 때 더 큰지, 작은지 판별하기 위해 dx, dy라는 리스트를 생성해 주었다.
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)
봉우리인 경우를 카운팅 하기 위해 cnt를 초기 값을 0으로 초기화 해주고 격자판 값을 체크하기 위해 i와 j의 for문을 돌려주고 0번째는 아까 0으로 모두 초기화 시켜놨기 때문에 1부터 시작해서 n+1값까지 체크하도록 한다.
그 안에 if문을 만들어 사각보다 중앙 값이 큰가를 체크할 수 있는 코드를 넣었다. a[i][j]위치에 있는 값은 그 위치의 상,하,좌,우 보다 값이 커야하고 각 값은 for문을 통해 반복하며 위에서 생성한 dx, dy리스트에서 값을 하나씩 뺴내어 체크하게 된다.
값이 사각보다 큰 값이면 cnt를 1씩 누적 카운팅하게 되고 결과적으로 cnt를 출력하여 정답을 확인한다.
'Algorithm > 파이썬 알고리즘 문제풀이 (코딩테스트대비)' 카테고리의 다른 글
[파이썬 알고리즘 문제풀이] : 이분 검색 (0) | 2022.05.04 |
---|---|
[파이썬 알고리즘 문제풀이] : 사과나무 (0) | 2022.01.02 |
[파이썬 알고리즘 문제풀이] : 격자판 최대합 (0) | 2021.12.31 |
[파이썬 알고리즘 문제풀이] : 수들의 합 (0) | 2021.12.31 |
[파이썬 알고리즘 문제풀이] : 두 리스트 합치기 (0) | 2021.12.30 |
댓글