🖥️ CS/Baekjoon Algorithms

#14716번 현수막 (C++)

한국의 메타몽 2020. 9. 24. 10:06

링크 : www.acmicpc.net/problem/14716

 

14716번: 현수막

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

www.acmicpc.net

 

문제풀이는 다음과 같다.

 

(1) 배열의 첫 지점부터 끝 지점까지 for문을 돌린다. 

(2) 해당 지점을 방문한 적이 없으며(false), 1의 값을 가질 경우 DFS를 진행한다.

DFS를 빠져나왔을 경우를 고려하여 바로 다음 줄에는 결과값을 + 1 해주는 코드를 작성한다. 

(3) 해당 지점의 상하좌우, 대각선 방향으로 for문을 돌려서 해당 값이 값을 초과하지 않고, 방문한 경험이 없었으며(false), 1의 값을 가질 경우에 그 값을 기준으로 또 다시 dfs를 진행한다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int y = 0, x = 0, ans = 0;
int my[8] = {1,1,0,1,-1,-1,0,-1};
int mx[8] = {0,1,1,-1,0,-1,-1,1};
bool check[252][252] = { false, };
int v[252][252];

bool track(int h, int w) {
    if (h<1 || h>y || w<1 || w>x || check[h][w] || v[h][w] == 0) return false;
    else return true;
}

void dfs(int h, int w) {
    check[h][w] = true;
    for (int i = 0; i < 8; i++) {
        int ny = h + my[i];
        int nx = w + mx[i];
        if (track(ny, nx)) {
            dfs(ny, nx);
        }
    }
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int a = 0;
    cin >> y >> x;
    for (int i = 1; i <= y; i++) {
        for (int j = 1; j <= x; j++) {
            cin >> a;
            v[i][j] = a;
        }
    }
    for (int i = 1; i <= y; i++) {
        for (int j = 1;j <= x; j++) {
            if (!check[i][j] && v[i][j] == 1) {
                dfs(i, j);
                ans++;
            }
        }
    }
    cout << ans << "\n";
    return 0;
}

처음에 바로 정답은 나왔지만, 메모리와 시간이 크게 나왔다는 점이 내키지 않았다.

코드를 조금 수정하여 시간을 절반으로 단축시켰지만 메모리 크기는 감소시키지 못했다. 

(시간 단축을 위해, track(ny,nx)이전에 if(!check[ny][nx]&&arr[ny][nx]==1)을 추가했다)

 

아마 초반에 배열을 크게 잡고 그대로 진행한 것이 문제였을 것이다.

다음 부터는 vector를 통해 구현할 수 있도록 시도해봐야겠다. 

 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#9446번 텀 프로젝트 (C++)  (0) 2020.09.25
#2668번 숫자고르기 (C++)  (0) 2020.09.24
#10026번 적록색약 (C++)  (0) 2020.09.21
#2468번 안전 영역 (C++)  (0) 2020.09.20
#2667 단지번호붙이기 (C++)  (0) 2020.09.19