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

[Jungol] 정올 1337 달팽이 삼각형

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

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=609&sca=2020

Approach

아래와 같이 숫자를 채워갑니다.

map[0][0]을 시작으로 달팽이 모양 방향으로 숫자를 채워가는데 3가지 방향으로 존재합니다.

방향 전환하는 시기는 배열의 범위를 벗어나거나 이미 숫자가 채워진 경우입니다.

또한 멈추는 시기는 방향을 전환한 다음 지점이 범위를 벗어나거나 숫자가 채워진 경우입니다.


#include <stdio.h>
 
const int MAX_N = 100 + 5;
const int MOD = 10;
const int dx[] = {1, 0, -1};
const int dy[] = {1, -1, 0};
int map[MAX_N][MAX_N];
int N, r, c, dir, isChangeCnt, num;
 
void init() {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            map[i][j] = -1;
        }
    }
}
 
bool isPossible(int x, int y) {
    if (x >= N || y >= N || x < 0 || y < 0 || map[x][y] >= 0) {
        return true;
    }
    return false;
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d", &N);
    init();
    while (1) {
        map[r][c] = num % MOD;
 
        int nextR = r + dx[dir];
        int nextC = c + dy[dir];
 
        if (isPossible(nextR, nextC)) {
            dir = (dir + 1) % 3;
            nextR = r + dx[dir];
            nextC = c + dy[dir];
            if (isPossible(nextR, nextC))
                break;
        }    
        r = nextR, c = nextC;
        num++;
    }
 
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j <= i; ++j) {
            printf("%d ", map[i][j]);
        }
        printf("\n");
    }
}

 

반응형

댓글