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 |