[문제설명]
*가장 자리를 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 0
1 0 5 3 7 2 3 0
2 0 3 7 1 6 1 0
3 0 7 2 5 3 4 0
4 0 4 6 3 4 1 0
5 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차원 리스트에 적용
'알고리즘? > 기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)' 카테고리의 다른 글
11. 격자판 회문수 이해 못함 (0) | 2023.05.12 |
---|---|
10. 스도쿠 (0) | 2023.05.12 |
8. 곶감(모래시계) pop(),append(), 7번문제 응용 (0) | 2023.05.10 |
7. 사과나무 (다이아몬드 ) (0) | 2023.05.10 |
6. 격자판 최대합 (1) | 2023.05.10 |