1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
아이디어:
연산 = 3*3 크기의 부분 행렬에 있는 모든 원소를 뒤집는 것
-> 행렬 A의 원소를 3*3 크기의 부분 행렬의 왼쪽 위 꼭짓점으로 하여 돌면서 B와 같지 않을 경우 연산을 수행하고 연산의 개수를 ans 에 업데이트 한다.
-> 모든 원소를 돌 필요는 없다. 3*3 크기의 부분 행렬의 개수는 정해져 있기 때문
-> 연산을 끝낸 행렬A와 행렬B가 같은지 비교 후 같지 않으면 -1을, 같으면 ans 출력
import sys
n, m = map(int, sys.stdin.readline().split())
a = []
b = []
ans = 0
for _ in range (n):
a.append(list(sys.stdin.readline().rstrip()))
for _ in range(n):
b.append(list(sys.stdin.readline().rstrip()))
for x in range(n-2):
for y in range(m-2):
if (a[x][y] != b[x][y]): #연산 수행
ans+=1
#a[x][y]를 왼쪽 위 꼭짓점으로 한 3*3 크기의 행렬의 모든 원소 뒤집기
for i in range(x, x+3):
for j in range(y, y+3):
if (a[i][j] == '0'):
a[i][j]='1'
else:
a[i][j]='0'
#a행렬과 b행렬이 일치하는 지 확인
for x in range(n):
for y in range(m):
if (a[x][y] != b[x][y]):
print(-1) #일치하지 않으면 -1을 출력하고 종료
sys.exit()
print(ans)
동아리 다른 부원이 짠 코드 보고 피드백:
행렬을 받아오는 연산이 어려워서 나는 그냥 문자열 그대로 가져왔는데, 숫자로 가져오는 방법이 더 깔끔하고 문제 취지에 맞는 것 같다.
a=[list(map(int,list(input()))) for _ in range(n)] -> 이렇게 받으면 행렬을 받을 수 있다.
a=[list(map(int, list(sys.stdin.readline().rstrip()))) for _ in range(n)] sys 모듈을 쓰면 이렇게 하면 된다.
그리고 이렇게 숫자로 행렬을 받아오면 연산을 수행할 때도 보다 간단하게 할 수 있다.
a[i][j] = 1 - a[i][j] 이렇게! 실행시간도 훨씬 적게 든다. 비교연산을 수행할 필요가 없어지니까
그리고 동아리 부원들은 함수를 따로 정의해서 풀었던데.. 나는 함수 정의를 좋아하지 않아서 그냥 풀었는데.. 무슨 방법이 더 좋은 건 지 모르겠다.
수정한 코드:
import sys
n, m = map(int, sys.stdin.readline().split())
a = [list(map(int, list(sys.stdin.readline().rstrip()))) for _ in range(n)]
b = [list(map(int, list(sys.stdin.readline().rstrip()))) for _ in range(n)]
ans = 0
for x in range(n-2):
for y in range(m-2):
if (a[x][y] != b[x][y]): #연산 수행
ans+=1
#a[x][y]를 왼쪽 위 꼭짓점으로 한 3*3 크기의 행렬의 모든 원소 뒤집기
for i in range(x, x+3):
for j in range(y, y+3):
a[i][j] = 1 - a[i][j]
#a행렬과 b행렬이 일치하는 지 확인
for x in range(n):
for y in range(m):
if (a[x][y] != b[x][y]):
print(-1) #일치하지 않으면 -1을 출력하고 종료
sys.exit()
print(ans)
'알고리즘💻 > 그리디' 카테고리의 다른 글
BOJ 11399번: ATM (0) | 2021.01.15 |
---|---|
BOJ 2839: 설탕 배달 (0) | 2021.01.15 |
BOJ 4796번: 캠핑 (0) | 2021.01.11 |
BOJ 16206번: 롤케이크 (0) | 2021.01.11 |
BOJ 14659번: 한조서열정리하고옴ㅋㅋ (0) | 2021.01.11 |