
배열에 대한 연습 문제를 풀어보는 세 번째 시간입니다.
(아직 배열에 일정한 규칙을 가지고 숫자를 넣어보는 문제입니다.)
배열과 for문(반복문) 사용을 할 수 있어야합니다.
배열을 잘 모르겠다면?
'[C언어] 배열(Array)의 이해와 예제, 문제'
일정한 규칙을 찾고 그걸 만드는 것은
프로그래밍 로직을 구성하는 훈련을 할 수 있으니
어떻게 하면 만들 수 있을지
잘 생각해보고 만들어보시면 좋을 것 같습니다.
(하나 하나 풀어가면 실력은 쌓이겠죠?)
완성된 소스는 제공합니다.
설명이 필요한 부분은 간단하게 설명(혹은 주석)도 함께 올리도록 하겠습니다.
(각자 자신만의 소스가 나올 수도 있겠죠.)
세 번째 시간의 문제도 1, 2 번째 시간과 유사한 문제입니다.
이번 시간에는 기존 5 X 5 배열을 10 X 10으로 수정하여도 결과가 잘 나오도록 완성해보기도 하죠.
새로운 Project를 생성하여 작성해보세요.
문제1. 아래의 사진과 같이 5 X 5 배열에 숫자를 넣고, '실행 결과 예'와 같이 출력하시오.
(반복문을 사용하여 만드시길 바랍니다.)
숫자 증가가 열 기준으로 우측으로, 좌측으로 행이 바뀔 때마다 바뀌면서 진행되고 있죠?
(배열 안의 데이터 순서)

(실행 결과 예)

(\t을 이용하여 탭으로 간격을 주며 배열을 출력하는 것은 저번 문제와 같습니다.)

완성 소스(Source.c)
#include<stdio.h>
//Prosto
int main(void) {
int arr[5][5];
int cnt=0; //숫자 카운트.
int dir = 1; //진행방향.
//배열에 숫자 넣어주는 부분.
for (int i = 0; i < 5; i++) {
if (dir == 1) {
for (int j = 0; j < 5; j++) {
cnt++;
arr[i][j] = cnt;
}
}
else {
for (int j = 4; j > -1; j--) { //(5-1)4부터 ~ (-1보다 큰)0까지 -1씩 진행.
cnt++;
arr[i][j] = cnt;
}
}
dir *= -1; //방향 전환.
}
//아래는 배열 순서대로 출력하여 확인.
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
완성 방법에는 다양한 방법이 있겠죠?
다른 방법으로도 해뒀으니, 2번 문제도 해결한 후 확인해보세요.
문제2. 아래의 사진과 같이 5 X 5 배열에 숫자를 넣고, '실행 결과 예'와 같이 출력하시오.
(반복문을 사용하여 만드시길 바랍니다.)
숫자 증가가 열 기준으로 우측으로, 좌측으로 행이 바뀔 때마다 바뀌면서 진행되고 있죠?
(문제1번과 달리 이번에는 우측에서 시작했네요. 1번 소스에서 어디를 바꿔주면 될까요?)
(배열 안의 데이터 순서)

(실행 결과 예)


어느 부분이 바뀌었나요?
기존 소스에서는 dir만 1에서 -1로 바뀌었죠?
이렇게 바꾸기만 했는데 왜 12345 순이 아닌 54321 순으로 시작할까요?
Source.c
#include<stdio.h>
//Prosto
int main(void) {
int arr[5][5];
int cnt=0; //숫자 카운트.
int dir = -1; //진행방향.
//배열에 숫자 넣어주는 부분.
for (int i = 0; i < 5; i++) {
if (dir == 1) {
for (int j = 0; j < 5; j++) {
cnt++;
arr[i][j] = cnt;
}
}
else {
for (int j = 4; j > -1; j--) { //(5-1)4부터 ~ (-1보다 큰)0까지 -1씩 진행.
cnt++;
arr[i][j] = cnt;
}
}
dir *= -1; //방향 전환.
}
//아래는 배열 순서대로 출력하여 확인.
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
for문을 두 개 쓰지 않고,
하나만 써서 하는 방법입니다.
Source.c
#include<stdio.h>
//Prosto
int main(void) {
int arr[5][5];
int cnt=0; //숫자 카운트.
int tempNum; //임시 저장 변수.
//아래 3개의 변수가 두 번 째 for문(열)에 사용됨.
int startNum = 0; // (반대는 4)
int endNum = 5; //0-4열. (반대는 -1)
int plusNum = 1; //행 바뀔 때 1씩 증가, 1씩 감소로 바뀜. (반대는 -1)
//배열에 숫자 넣어주는 부분.
for (int i = 0; i < 5; i++) {
for (int j = startNum; j != endNum; j+=plusNum) {
cnt++;
arr[i][j] = cnt;
}
plusNum *= -1; //반대로 뒤집음.
endNum += plusNum;
startNum += plusNum;
// startNum, endNum은 위의 for문 하나로 하기위해 시작, 종료 지점 때문.
tempNum = startNum; //swap.
startNum = endNum;
endNum = tempNum;
}
//아래는 배열 순서대로 출력하여 확인.
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
마지막으로 기존 소스를 바꿔 10 X 10 배열에 넣어주고 출력 결과를 나타내 보세요.
(출력 결과 예)

//10x10으로 바꿔서 출력하기 위한 수정.
#include<stdio.h>
//Prosto
int main(void) {
int arr[5][5];
int rowNum = 5; //행.
int colNum = 5; //열.
int cnt = 0; //숫자 카운트.
int tempNum; //임시변수.
int startNum = 0;
int endNum = colNum;
//배열에 숫자 넣어주는 부분.
for (int i = 0; i < rowNum; i++) {
if (startNum == 0) {
for (int j = startNum; j < endNum; j++) {
cnt++;
arr[i][j] = cnt;
}
}
else {
for (int j = startNum-1; j >= endNum; j--) {
//(5-1)4부터 ~ (-1보다 큰)0까지 -1씩 진행.
cnt++;
arr[i][j] = cnt;
}
}
tempNum = startNum;
startNum = endNum;
endNum = tempNum;
}
//아래는 배열 순서대로 출력하여 확인.
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
여기서 어디를 바꿔주면 10x10이 바로 나오게 될까요?
(지금 만들어둔 소스에서는 마찬가지로 다른 배열도 되겠죠?)
int arr[10][10];
int rowNum = 10;//행.
int colNum = 10;//열.
이렇게 세 줄만 바꿔주면 10x10이 정상 출력되는 것을 확인할 수 있습니다.
궁금한 점 있으시면 댓글이나 따로 메일로 질문하시면 시간되는 대로 답변드리겠습니다. ( 연락 )