컴퓨터기본/문제풀이

[정올] 1495 : 대각선 지그재그

차가운오미자 2021. 9. 3. 14:37

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

 

JUNGOL

 

www.jungol.co.kr

문제 분석

차례대로 채워나가는 칸의 방향과 좌표의 움직임을 고려해보면 다음과 같다

범위를 넘어갔을 때 방향전환과 더불어 새로운 위치를 설정해주면 된다.

 

작성 코드

#include <stdio.h>
#define UP 1
#define DOWN 0

int N;
int arr[100][100];

int dx[2] = { -1, 1 };
int dy[2] = { 1, -1 };

int main(void)
{
    int i = 1;
    int x = 1, y = -1;
    int d = DOWN;
    scanf("%d", &N);
    for (; i <= N * N; i++) {
        x += dx[d];
        y += dy[d];

        if (d == DOWN) {
            if (x < 0 || y >= N) {
                if (y >= N) {
                    y--;
                    x += 2;
                }
                else
                {
                    x++;
                }
                
                d = UP;
            }
        }
        else {
            if(y<0 || x>=N)
            {
                if (x>=N) 
                {
                    y += 2;
                    x--;
                }
                else 
                {
                    y++;
                }
                d = DOWN;
            }
        }
        arr[y][x] = i;
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

주의할 점은 모서리 부분이다

각 방향 (Down, Up)의 경우에서 모두  x>=N 과 y>=N 인 경우를 먼저 고려해줘야 한다. 

안그러면 (N이 홀수인 경우) 노란색보다 주황색이 우선되어서 왼쪽 아래 노란 모서리를 찍은 다음 그 오른쪽 칸으로 다음 좌표가 적용된다. 짝수인 경우 오른쪽 모서리에서 그러한 상황이 나타날 수 있다. 

 

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

[백준] 11654: 아스키 코드  (0) 2021.09.06
[백준] 2108: 통계학  (0) 2021.09.06
[백준] 10799번: 쇠막대기  (0) 2021.09.03
[백준] 2567번: 색종이 - 2  (0) 2021.09.03
[정올] 2008 : 할부  (0) 2021.09.03