본문 바로가기
Algorithm/파이썬 알고리즘 문제풀이 (코딩테스트대비)

[파이썬 알고리즘 문제풀이] : 봉우리

by 오주현 2022. 1. 19.
반응형

코딩 테스트 문제 풀이

문제 이름 : 봉우리

지도 정보가 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를 출력하여 정답을 확인한다.

반응형

댓글