Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 봉우리

yaebb_82 2023. 5. 2.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

 

문제

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요. 격자의 가장자리는 0으로 초기화 되었다고 가정한다.

 

 

 

 

풀이

• 내 풀이

import sys
input = sys.stdin.readline

N = int(input())
height = [list(map(int, input().split())) for _ in range(N)]
count = 0

for i in range(N):
    for j in range(N):
        current = height[i][j]

        if i == 0:
            up = 0    
            down = height[i+1][j]
        elif i == N-1:
            up = height[i-1][j]
            down = 0
        else:
            up = height[i-1][j]
            down = height[i+1][j]
            
        if j == 0:
            left = 0     
            right = height[i][j+1]
        elif j == N-1:
            left = height[i][j-1]
            right = 0
        else:
            left = height[i][j-1]
            right = height[i][j+1]

        if up < current and down < current and left < current and right < current:
            count += 1

print(count)

• 답안 : Python

import sys
input = sys.stdin.readline

N = int(input())
height = [list(map(int, input().split())) for _ in range(N)]
count = 0

# 상, 우, 하, 좌 (시계방향)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

height.insert(0, [0]*N)
height.append([0]*N)

for i in height:
    height.insert(0,0)
    height.append(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)):
            count += 1

print(count)

- 나는 직접 0으로 초기화해주지는 않고 주어진 인덱스 범위를 벗어날 경우 0이라고 가정하고 코드 구현을 했고, 마지막에 모든 조건을 and로 이어서 확인을 해주었다. 그러다보니 전체적으로 코드도 길어지고 구현한 코드가 좋지 않다고 느껴졌다.

- 답안에서는 직접 0으로 초기화해주는 과정을 진행했고, 상하좌우 비교하는 것을 리스트로 선언해서 for문으로 확인하는 방법으로 진행했다. 또한 마지막에 모든 조건을 확인할 때 all()을 사용해서 처리를 해주었다.

- 답안의 방법이 좀 더 효율적인 방식이라고 생각되어, 해당 방법을 익혀서 앞으로 자주 사용해야 겠다는 생각을 했다.

 

 

 

반응형

댓글