[BOJ15999] 뒤집기
Updated:
격자판 초기 상태로 가능한 경우의 수를 1,000,000,007로 나눈 나머지
- N x M 행렬
- 격자를 누르면 자신을 포함해 연결된 칸 색이 반전됨
- 연결의 조건 : 두 격자 사이를 같은 색이면서 변을 공유
- 최종 상태로 초기 상태 유추
- 두 격자판의 상태가 다른 경우 : 같은 위치의 격자의 색이 다른 경우가 존재할 때
입력
- 첫 줄에 행 열 : N, M (1 <= N, M <= 2,000)
- N개의 줄에 각 격자의 색을 나타내는 문자열 (b, w)
출력
- 첫 줄에 격자의 초기 상태로 가능한 경우의 수를 1,000,000,007(10^9+7)로 나눈 나머지
설계
- 격자를 누르면 연결된 격자의 색이 같이 변하므로, 현재 상태에 특정 격자와 인접해있는 격자의 색이 다르면 ex) bw 이 상태는 초기상태와 같다
- 따라서 다른 색이 인접해있는 경우가 아닌 격자들은 모두 색이 바뀔 수 있는 상태
- 총 격자 수 - 인접한 격자가 색이 다른 격자의 수
- 구한 다음에 2 제곱 후 모듈러 연산
피드백
- BFS를 이용해서 인접한 경우가 색이 다른 경우를 체크했는데, 자꾸 틀림
- wbbw 와 같은 경우에서 세 번째 격자인 b를 체크 못 해주는 상황이 발생 (두 번째 b가 세 번째 b 탐색할 때 색이 같아서 방문 체크만하고 카운팅 안 함)
- 그냥 쉽게 각 격자 모두 탐색 2중 루프 돌리고 사방 체크 후 다른 격자 있으면 카운팅 하는 방식 사용
- 그래도 답이 계속 틀림
- 아무래도 배열이 크기 때문에 제곱할 때 오버플로우가 생긴 듯 함
- 제곱 연산을 pow함수가 아닌 for문으로 구현하고 루프를 돌 때마다 나머지(모듈러) 연산도 함께 실행
How I solved(click to github)
ref :
BOJ15999
Leave a comment