boj

별찍기-10 2447

mallang_col 2022. 12. 26. 07:35

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

[2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net](https://www.acmicpc.net/problem/2447)

사실 처음 문제를 봤을때 이게 무슨말인가 하고 막막한 감정을 숨길수 없었다. 하지만

찬찬히 문제를 읽어보았을때 로직은 간단한 내용임을 확인 할 수 있었다.

기본적으로 제공되는 n이 무조건 3의 거듭제곱의 모양으로 주어지기 때문에 여기서 3으로 나누는 값들을 기준으로

중앙일때는 공백 나머지는 계속 재귀를 돌리면서 해결하고자 하였다


void solve(int x, int y, int n) {
    int depth = n / 3;
    if (depth == 1) {
        for (int i = x; i < x + 3; ++i) {
            for (int j = y; j < y + 3; ++j) {    
                if (i == x + 1 && j == y + 1) {
                    map[i][j] = ' ';
                    continue ;
                }
                map[i][j] = '*';
            }
        }
        return ;
    }
    for (int i = x; i < x + n; i += depth) {
        for (int j = y; j < y + n; j += depth) {
            if (i == x + depth && j == y + depth) {
                for (int k = i; k < i + depth; ++k) {
                    for (int l = j; l < j + depth; ++l) {
                        map[k][l] = ' ';
                    }
                }
            } else {
                solve(i, j, depth);
            }
        }
    }
}

이렇게 4중포문을 써야 했는데 로직이 너무 더러운듯하다 . 2중포문에서 재귀를 타고

공백인 부분이였다면 공백으로 칠해주고 해야하는데 위와 같은 로직을 구현하면서도 효율성을 찾고 싶었다.

 

이렇게 글을 쓰는 입장에서 사실 지금 뎂스를 통해서 위치를 잡고 더하고 하는 방식으로 추가하는 로직을 이용하였는데

효율적인 로직을 찾고 사용해 보려고 한다.