본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1331 문자마름모

by 까망 하르방 2021. 3. 17.
반응형

출처: http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2073&sca=20

Approach

아래와 같이 상단 중간 위치를 기준으로 마름모를 형성합니다.

- 아스키 코드 A(65) ~ Z(90)까지 값을 채워갑니다.

초기 N (가장 큰 마름모의 한 변의 길이) 홀/짝과 관계없이 마름모 한 변의 길이는

안쪽으로 갈수록 1씩 감소하므로, 제일 중앙 위치(map[N][N])는 4가지 방향으로 돌지않고 값을 대입하면 됩니다.

 


#include <stdio.h>
 
const int MAX_N = 100 + 5;
int N, x, y, val;
int map[MAX_N * 2][MAX_N * 2];
const int dx[] = { 0, 1, 1, -1, -1 };
const int dy[] = { 0, -1, 1, 1, -1 };
 
void printMap() {
    int left = N, right = N;
    for (int i = 1; i <= 2 * N - 1; ++i) {
        // 알파벳 앞에 공백 처리
        for (int j = 1; j < left; ++j) {
            printf("  ");
        }
        for (int j = left; j <= right; ++j) {
            printf("%c ", map[i][j]);
        }
        if (i < N) left--, right++;
        else left++, right--;
        printf("\n");
    }
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d", &N);
 
    int sideSize = N;
    int val = 65;
 
    // (중앙) 시작점
    for (int i = 1; i <= N; ++i) {
        x = i, y = N;
        // 방향 4개
        for (int j = 1; j <= 4; ++j) {
            // 마름모의 길이 - 1
            for (int k = 1; k < sideSize; ++k) {
                map[x][y] = val++;
                // A ~ Z 순환
                if (val > 90) val = 65;
                x = x + dx[j];
                y = y + dy[j];
            }
        }
        // 안쪽으로 갈수록 마름모 변의 길이 -1
        sideSize--;
    }
 
    // 가장 중앙 좌표의 값
    map[N][N] = val;
    // 출력
    printMap();
}

 

반응형

댓글