아하
  • 토픽

  • 스파링

  • 잉크

  • 미션


하얀고슴도치236

하얀고슴도치236

C언어에서 옆으로 된 모래시계를 출력하는 방법은 무엇인가요?

C언어에서 옆으로 된 모래시계를 출력하는 방법은 무엇인가요?

예를들어서 5를 입력받으면

1 13 2 6 10 14 3 7 9 11 15 4 8 12 16 5 17

이런식으로 나와야 합니다.

1 2 3 4 5

6 7 8

9

10 11 12

13 14 15 16 17

이렇게도아니고 옆으로 눕히려고하니까 어떻게 할지 모르겠습니다.

도움 부탁드립니다.

    2개의 답변이 있어요!

    • 남다른메추리264

      남다른메추리264

      5X5 2차원 배열에 각 원소 값 및 space를 대입해서 행렬을 전치하면 간단할 것 같습니다.

      for (int i = 0; i < 5); i++) { for (int j = 0; j < 5; j++) { matrix[i][j] = matrix[j][i]; } }

      변환된 배열 각 원소를 char로 바꾼 후 string으로 합하여 출력하면 될 듯 싶네요.

      감사합니다.

    • 크게 세 가지 방법이 있습니다.

      일단 고수들의 방법.

      #include <stdio.h> main() { puts("1 13"); puts("2 6 10 14"); puts("3 7 9 11 15"); puts("4 8 12 16"); puts("5 17"); return 0; }

      직관적이죠. 실행 속도도 빠르고요.

      그리고 (아마도) 가장 무난한 방법

      #include <stdio.h> #define SIZE 5 #define min(x, y) ((x) < (y) ? (x) : (y)) int main(int argc, char **argv) { int map[SIZE][SIZE], curr = 0, i, j, start, end; for(i = 0; i < SIZE; i++) { start = min(i, SIZE - i - 1); end = SIZE - min(i, SIZE - i - 1); for(j = start; j < end; j++) { map[i][j] = ++curr; } } for(i = 0; i < SIZE; i++) { start = min(i + 1, SIZE - i); end = SIZE - min(i + 1, SIZE - i); for(j = 0; j < SIZE; j++) { if(j < start || end <= j) { printf("%2d ", map[j][i]); } else { printf(" "); } } printf("\n"); } return 0; }

      크기가 크지 않다면 배열에 저장해뒀다가 전치로 출력하는 방법도 좋습니다.

      그리고 크기가 커서 메모리에 다 담기 부담스러운 수준이라면...

      #include <stdio.h> #define SIZE 5 #define min(x, y) ((x) < (y) ? (x) : (y)) int main(int argc, char **argv) { int i, j, start, end, last, tmp; if(SIZE % 2) { last = (SIZE / 2 + 1) * (SIZE / 2 + 1) * 2 - 1; } else { last = (SIZE / 2 + 1) * (SIZE / 2) * 2; } for(i = 0; i < SIZE; i++) { start = min(i + 1, SIZE - i); end = SIZE - min(i + 1, SIZE - i); for(j = 0; j < SIZE; j++) { if(j < start) { if(SIZE % 2) { tmp = (SIZE / 2 + 1) * (SIZE / 2 + 1) - (SIZE / 2 + 1 - j) * (SIZE / 2 + 1 - j); } else { tmp = (SIZE / 2 + 1) * (SIZE / 2) - (SIZE / 2 + 1 - j) * (SIZE / 2 - j); } printf("%2d ", tmp + i - j + 1); } else if(end <= j) { if(SIZE % 2) { tmp = (SIZE / 2 + 1) * (SIZE / 2 + 1) - (SIZE / 2 + 1 - SIZE + j) * (SIZE / 2 + 1 - SIZE + j); } else { tmp = (SIZE / 2 + 1) * (SIZE / 2) - (SIZE / 2 + 1 - SIZE + j) * (SIZE / 2 - SIZE + j); } printf("%2d ", last - tmp + i - SIZE + j + 2); } else { printf(" "); } } printf("\n"); } return 0; }

      좀 끔찍하지만, 이렇게 규칙을 구해서 하는 방법도 있습니다.