https://www.acmicpc.net/problem/22352
22352번: 항체 인식
첫 번째 줄에는 SP 촬영 결과의 크기를 의미하는 두 정수 $N$과 $M$이 주어진다. ($1 \le N, M \le 30$) 이는 촬영 결과가 세로로 $N$칸, 가로로 $M$칸 크기의 격자라는 것을 의미한다. 다음 $N$개의 줄에는
www.acmicpc.net
이 문제의 핵심은 같은 데이터 값을 가진 상하좌우로 인접한 모든 칸을 구하는 것이다.
while 문을 활용해,
를 반복하여 계산하였다.
계산한 값을 통해 before행렬을 바로바로 변화시켰고, 최종적인 before행렬과 after행렬을 비교하였다.
N, M = map(int, input().split())
before = [list(map(int, input().split())) for _ in range(N)]
after = [list(map(int, input().split())) for _ in range(N)]
if before == after: # 변화가 없는 경우
print('YES')
else:
for i in range(N):
for j in range(M):
if before[i][j] - after[i][j] != 0:
x, y = i, j
break
if before[i][j] - after[i][j] != 0:
break
before_num = before[x][y]
after_num = after[x][y]
lst = []
i, j = x, y # 가장 상단의 변화한 숫자의 좌표
while True:
before[i][j] = after_num
if i>0: # 같은 값을 가진 인접 좌표를 저장
if before[i-1][j] == before_num:
lst.append((i-1,j))
if j>0:
if before[i][j-1] == before_num:
lst.append((i,j-1))
if i<N-1:
if before[i+1][j] == before_num:
lst.append((i+1,j))
if j<M-1:
if before[i][j+1] == before_num:
lst.append((i,j+1))
if not lst: # 모든 좌표를 사용한경우
break
i,j = lst.pop() # 저장된 좌표를 꺼내옴
if before == after: # 모든 격자의 변화와 인접격자의 변화가 일치하는 경우
print('YES')
else:
print('NO')
[백준/BOJ] #1436 영화감독 숌.python(파이썬) (0) | 2021.08.05 |
---|---|
[백준/BOJ] #2839 설탕배달.python(파이썬) (0) | 2021.08.03 |
[백준/BOJ] #22351 수학은 체육과목 입니다 3.python(파이썬) (0) | 2021.08.01 |
[백준/BOJ] #1680 쓰레기 수거.python(파이썬) (0) | 2021.07.31 |
[백준/BOJ] #1463 1로 만들기.python(파이썬) (0) | 2021.07.30 |