[백준 C++] 14397 해변

이성훈·2022년 7월 18일
0

문제

단위 정육각형 이루어져 있는 지도가 주어졌을 때, 해변의 길이를 구하는 프로그램을 작성하시오.

해변은 정육각형의 변 중에서 한 쪽은 물인데, 한 쪽은 땅인 곳을 의미한다.

입력

첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 50)

둘째 줄부터 N개의 줄에 지도가 주어진다. '.'은 물, '#'은 땅이다.

출력

첫째 줄에 해변의 길이를 출력한다.

https://www.acmicpc.net/problem/14397

풀이

땅위치를 행과 열로 나타낸다면,
짝수 행일때와 홀수 행일때, 각 인접한 6개의 땅의 상대적인 위치가 각기다르다. 이것을 구현하여,
모든땅에서 인접한 6개를 검토하여 결과를 내면 된다.

(0,2) 에서 나타낸 좌표가 짝수행 일때, (1,4)에서 나타낸 좌표가 홀수행일때 각 인접한 6개의 상대적 위치이다.

이런식으로 모든 땅을 검토하여 결과를 출력하면된다.

#define _CRT_SECURE_NO_WARNINGS 
#include <bits/stdc++.h>
using std::vector; using std::pair; typedef pair<int, int> pii;
int n, m, **map; //1 : 땅 0: 물
vector<pii> land; //땅의 위치를 기록
int dx1[] = { -1, -1, 0, +1, +1, 0 };
int dx2[] = { -1, -1, 0, +1, +1, 0 };
int dy1[] = { -1, 0, +1, 0, -1, -1 };
int dy2[] = { 0, +1, +1, +1, 0, -1};
int res = 0;

void init() {
    scanf("%d%d", &n, &m);
    map = new int* [n];
    for (int i = 0; i < n; i++) {
        map[i] = new int[m];
        char c;
        scanf("%c", &c);
        for (int j = 0; j < m; j++) {
            
            scanf("%c", &c);
            if (c == '.')
                map[i][j] = 0;
            else if (c == '#') {
                map[i][j] = 1;
                land.push_back({ i, j });
            }
        }
    }

}

void logic() {
    for (int i = 0; i < land.size(); i++) {
        int x = land[i].first;
        int y = land[i].second;

        for (int dir = 0; dir < 6; dir++) {
            int xx;
            int yy;

            if (x % 2 == 0) { //짝수 행
                xx = x + dx1[dir];
                yy = y + dy1[dir]; 
            }
            else { //홀수 행
                xx = x + dx2[dir];
                yy = y + dy2[dir]; 
            }


            if (xx < 0 || yy < 0 || xx == n || yy == m)
                continue;
            if (map[xx][yy] == 0) 
                res++;
        }
    }

    printf("%d", res);
}


int main(void) {
    init();
    logic();

    return 0;
}
profile
I will be a socially developer

0개의 댓글