0925. dxdy (2)

sea·2023년 9월 24일
0

알고리즘

목록 보기
6/14
  • dx, dy 격자
5 * 5 크기의 격자가 주어집니다.

0 0 0 1 0
0 1 1 1 0
0 0 0 0 1
1 0 1 1 1
1 0 1 1 0

(3행, 2열) 위치의 인접한 상하좌우 칸에 숫자 1이 몇 개 있나요?

행렬 i, j 를 dx, dy 와 같이 표현
이때 0 부터 시작되므로 (3, 2) -> (2, 1)

think

  • 좌표 하나 잡고 상하좌우 4방향에 대한 dx, dy 정의
  • 숫자 칸의 1이 몇 개? -> 해당 2차원 배열의 [nx][ny] == 1일 경우 count += 1
  • 예외조건 nx, ny가 범위 밖을 넘어갈 경우 -> in_range 함수 필수 작성
**CODE**
1. if in_range(nx, ny) and a[nx][ny] == 1:  # in_range(x, y) 가 true 이고, 1일 경우 
2. def in_range(x, y):
   return x >= 0 and x < 5 and y >= 0 and y < 5
# 조건

x, y = 2, 4 # 행렬이기 때문에
dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0] # 행렬 좌표값


# x, y + 상하좌우 확인하고(range 4), 숫자 1일 경우 count += 1
# 예외: 5 보다 클 때

def in_range(x, y):
    return x >= 0 and x < 5 and y >= 0 and y < 5

a = [[0, 0, 0, 1, 0],
     [0, 1, 1, 1, 0],
     [0, 0, 0, 0, 1],
     [1, 0, 1, 1, 1],
     [1, 0, 1, 1, 0]]


count = 0

for dx, dy in zip(dxs, dys): # 4쌍 = 4번 반복
    nx, ny = x + dx, y + dy
    # 이제 인접한 곳에 1이 있는지를 확인하기 전에, 먼저 (nx, ny)가 격자 안에 들어오는지를 확인
    if in_range(nx, ny) and a[nx][ny] == 1:  # in_range(x, y) 가 true 이고, 1일 경우 ##
        count += 1

print(count)
# 변수 선언 및 입력
n = int(input())
arr = [
    list(map(int, input().split()))
    for _ in range(n)
]

dxs = [0, 1,  0, -1]
dys = [1, 0, -1,  0]


def in_range(x, y):
    return 0 <= x and x < n and 0 <= y and y < n


def adjacent_cnt(x, y):
    cnt = 0
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        if in_range(nx, ny) and arr[nx][ny] == 1:
            cnt += 1
    
    return cnt


# 각 칸을 탐색합니다.
ans = 0
for i in range(n):
    for j in range(n):
        if adjacent_cnt(i, j) >= 3:
            ans += 1
    
print(ans)
profile
달려가는중

0개의 댓글