코딩하는 베어브릭

탐색&시뮬레이션 문제 #9. 봉우리 본문

알고리즘/인프런: 파이썬 알고리즘 문제풀이

탐색&시뮬레이션 문제 #9. 봉우리

bearbrick 2022. 5. 31. 19:50

*이 풀이는 인프런: 파이썬 알고리즘 문제풀이 강좌에 기반하였습니다.

 

 

 

내 풀이

 

1. if문으로 모든 경우를 나눠준다. 4개의 모서리는 모서리 주변의 2군데만 확인하면 되고, 첫번째 행, 마지막 행, 첫번째 열, 마지막 열은 그 주변의 3군데만 확인하면 된다. 그리고 이외의 경우는 상하좌우 4군데 전부 확인해야한다. 

 

코드를 짤 때 주의해야할 것은 어떤 조건문을 위에 작성할 것인지 생각해야한다.

 

import sys
#sys.stdin=open("input.txt","rt")

n=int(input())
arr=[list(map(int, input().split())) for _ in range(n)]
cnt=0

for i in range(n):
    for j in range(n):
        if i==0:
            if j==0:
                if arr[i][j] > arr[i][j+1] and arr[i][j] > arr[i+1][j]:
                    cnt+=1
            elif j==n-1:
                if arr[i][j] > arr[i][j-1] and arr[i][j] > arr[i+1][j]:
                    cnt+=1
            else:
                if arr[i][j]>arr[i][j-1] and arr[i][j]>arr[i][j+1] and arr[i][j]>arr[i+1][j]:
                    cnt+=1
        elif i==n-1:
            if j==0:
                if arr[i][j] > arr[i-1][j] and arr[i][j] > arr[i][j+1]:
                    cnt+=1
            elif j==n-1:
                if arr[i][j] > arr[i-1][j] and arr[i][j] > arr[i][j-1]:
                    cnt+=1
            else:
                if arr[i][j]>arr[i][j-1] and arr[i][j]>arr[i][j+1] and arr[i][j]>arr[i-1][j]:
                    cnt+=1
        elif j==0:
            if arr[i][j]>arr[i-1][j] and arr[i][j]>arr[i][j+1] and arr[i][j]>arr[i+1][j]:
                cnt+=1
        elif j==n-1:
            if arr[i][j]>arr[i-1][j] and arr[i][j]>arr[i][j-1] and arr[i][j]>arr[i+1][j]:
                cnt+=1
        else:
            if arr[i][j]>arr[i-1][j] and arr[i][j]>arr[i][j-1] and arr[i][j]>arr[i+1][j] and arr[i][j]>arr[i][j+1]:
                cnt+=1
        
print(cnt)

 

 

 

강사님 풀이

 

import sys
sys.stdin=open("input.txt","rt")

n=int(input())
a=[list(map(int, input().split())) for _ in range(n)]

# 맨 위의 행 삽입
a.insert(0,[0]*n)

# 맨 아래 행 삽입
a.append([0]*n) # == a.insert(n+2,[0]*n)

#맨 왼쪽, 오른쪽 열 삽입
for x in a:
    x.insert(0,0)
    x.append(0)

cnt=0
dx=[-1,0,1,0] #행
dy=[0,1,0,-1] #열

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)

 

 

 

배운 점

 

1. 리스트 내장함수 insert( a, [ b ] ) : a번째 행에 [ b ] 배열 삽입

 

2. 리스트 내장함수 append( [ b ] ): 마지막 행에 [ b ] 배열 삽입

 

3. all( ) : 모든 요소가 참이어야지만 참 반환

 

a=[1,2,3,4,5]
if all(x>0 for x in a): # Yes 출력
    print("Yes")
else:
    print("No")

 

4. 상하좌우를 탐색해야하는 경우, 행의 변위를 나타내는 dx = [ -1, 0, 1, 0 ], 열의 변위를 나타내는 dy = [ 0, 1, 0, -1 ] 로 초기화한다. 

그리고 반복문과 dx, dy를 이용해서 상하좌우를 간단한 코드로 나타낼 수 있다.

Comments