PS

BOJ 15999 - 뒤집기

728x90

www.acmicpc.net/problem/15999

 

15999번: 뒤집기

첫 줄에 격자의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 출력한다.

www.acmicpc.net

 

처음에 문제를 봤을때는, 이전 상태의 가능한 경우의 수를 모두 찾아내야 하니

브루트포스를 쓰는건가 싶었다.

 

오랫동안 문제 자체를 제대로 이해못하고 있다가, 

공식 홈페이지 해설을 보고 문제를 어떻게 풀어야 될지 방향성을 잡았다

tech.kakao.com/2018/09/12/code-festival-2018-round-2/

 

코드 페스티벌 2018 본선 이야기

2018 코드 페스티벌, 뜨거운 열기와 함께 본선 시작! 지난 8월 25일 토요일, 카카오 코드 페스티벌 오프라인 본선이 진행됐습니다. 예선에서의 엄청난 경쟁률을 뚫고 당당히 본선에 진출한 64명의

tech.kakao.com

 

위의 해설대로라면, 서로 같은 색상을 갖는 타일의 갯수를 찾아내야 했다.

탐색을 어떻게 할까 고민을 하다가, 인접한 격자(상하좌우 4방향)만 비교하면 되므로, BFS 나 DFS 는 아닐것 같았고,

N과 M 의 최대 크기가 2000 이므로, 2000 * 2000 * 4 를 하더라도 시간 초과가 나지 않아서 삼중포문을 사용했다.

 

그런데 문제는, 중복된 경우를 어떻게 배제할지에 대해서 많이 틀렸다

처음엔 dfs,bfs 에서 자주 나오는 bool visited[][] 이중 배열을 만들어서 방문 처리를 해봤다가

겹치는 격자가 처리가 안되서 틀렸고, 여러가지 써보다가 틀렸다.

 

처음엔 서로 같은 색상을 찾는데 중점을 두다가 나중엔 다른게 나오면 

전체 타일 수에서 빼는 것으로 바꿔서 처리했다.

( N * M - cnt )

 

- c++

#include <iostream>
 
#define MAX 2001
 
using namespace std;
 
const int MOD = 1000000007;
int n, m;
char adj[MAX][MAX];
int dy[4= {-1100};
int dx[4= {00-11};
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> n >> m;
    
    for (int i = 0; i < n; ++i) 
        for (int j = 0; j < m; ++j) 
            cin >> adj[i][j];
 
    int cnt = 0;
    // 2000 * 2000 * 4 => 시간내에 가능 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < 4++k) {
                int ny = i + dy[k], nx = j + dx[k];
                if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
                if (adj[i][j] != adj[ny][nx]) {
                    cnt++;
                    break;
                }
            }
        }
    }
    
    int answer = 1;
    for (int i = 0; i < (n * m) - cnt; ++i) 
        answer = (answer * 2) % MOD;
    
    cout << answer;
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 1034 - 램프  (0) 2021.01.20
BOJ 1937 - 욕심쟁이 판다  (0) 2021.01.17
BOJ 15997 - 승부예측  (0) 2021.01.17
BOJ 2254 - 감옥 건설  (0) 2021.01.16
BOJ 1276 - 교각 놓기  (0) 2021.01.14