본문 바로가기
알고리즘?/기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)

9. 봉우리

by 몰라닉네임 2023. 5. 11.

[문제설명]

*가장 자리를 0으로 초기화 하는 방법

 

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

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

#첫번째 행을 0으로 채우기
a.insert(0,[0]*n)
#마지막 행을 0으로 채우기
a.append([0]*n)

#각 행의 제일 앞, 뒤에 0을 넣는다.
for x in a:
    x.insert(0,0)
    x.append(0)
    
for x in a:
    print(x)

 

*상하좌우를 탐색하는 방법! 

(2차원 리스트의 원소의 상하좌우 탐색)

 

[문제 봉우리]

지도 정보가 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. 가장 자리 먼저 0으로 된 이차원 리스트 만들기

 

    0 1 2 3 4 5 6  (인덱스번호 )

 0 0 0 0 0 0 0

1   0 5 3 7 2 3 0 

 0 3 7 1 6 1 0

3   0 7 2 5 3 4 0

4   0 4 6 3 4 1 0

 0 8 7 3 5 2 0

6   0 0 0 0 0 0 0

 

2. a[1][1] 비교를 상하좌우 4번

12,3,6,9시 방향 순으로 비교

[0][1]. [1][2], [2][1], [1][0]

->

a[i][j]

a[i-1][j], a[i][j+1], a[i+1][j], a[i][j-1] 비교 

 

 

나의 코드


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

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

#첫번째 행을 0으로 채우기
a.insert(0,[0]*n)
#마지막 행을 0으로 채우기
a.append([0]*n)

#각 행의 제일 앞, 뒤에 0을 넣는다.
for x in a:
    x.insert(0,0)
    x.append(0)

res=0
for i in range(1, n+1):
    for j in range(1, n+1):
        if a[i][j]>a[i-1][j] and  a[i][j]>a[i][j+1] and a[i][j]>a[i+1][j] and a[i][j]>a[i][j-1]:
            res+=1
print(res)

 

*상하좌우 탐색 방법을 이용한 코드

(2차원 리스트의 원소의 상하좌우 탐색)

import sys
sys.stdin=open("input.txt", "rt")
#리스트의 상하좌우 탐
dx=[-1, 0, 1, 0] #행의 감소, 증가
dy=[0, 1, 0, -1] #열의 증가, 감소
n=int(input())
a=[list(map(int, input().split())) for _ in range(n)]

#첫번째 행을 0으로 채우기
a.insert(0,[0]*n)
#마지막 행을 0으로 채우기
a.append([0]*n)

#각 행의 제일 앞, 뒤에 0을 넣는다.
for x in a:
    x.insert(0,0)
    x.append(0)

res=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)):
            res+=1
print(res)

 

*본 문제는 인프런 김태원 강사님의 파이썬 알고리즘 문제풀이 강의에 기반합니다.  

 

[추가 공부]

python 상하좌우를 순서대로 list로 만들어 반환하는 함수

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

 

이차원 리스트의 [2][2]의 원소인 값 7에 접근하기 위해서는 전체 리스트에서 2번째 행을 indexing 하고 두번째 원소를 indexing 하면된다.

 

다음과 같은 논리를 통해 지정 원소의 상하좌우를 탐색할 수 있다.

a[2][2]

상 a[i-1][j]  

a[i+1][j]

a[i][j-1],

우 a[i][j+1] 

 

함수화하면

상 (x-1, y)

하 (x+1, y)

좌 (x, y+1)

우 (x, y-1)

 

상하좌우를 순서대로 list로 만들어 반환하는 함수

def find(list, index:set):
    x, y = index
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    res = []
    for k in range(4):
        a = lists[x+dx[i]][y+dy[i]]
        res.append(a)
    return res
    
res=find(list, (2,2))
print(res)
#[3, 2, 3, 1]

위 함수를 이용해 2차원 리스트에 적용