도전1
길이가 10인 배열을 선언하고 총 10개의 정수를 입력 받아서, 홀수와 짝수를 구분 지어 출력하는 프로그램을 작성해보자. 일단 홀수부터 출력하고 나서 짝수를 출력하도록 하자. 단, 10개의 정수는 main 함수 내에서 입력 받도록 하고, 배열 내에 존재하는 홀수만 출력하는 함수와 배열 내에 존재하는 짝수만 출력하는 함수를 각각 정의해서 이 두 함수를 호출하는 방식으로 프로그램을 완성하자.
힌트!!
홀수를 판단하는 함수와 짝수를 판단하는 함수를 만들어서 main 함수 안에서 실행하면 됩니다.
내가 작성한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h>
void odd(int* arr, int len) {
printf("홀수 출력: ");
for (int i = 0; i < len; ++i) {
if (arr[i] % 2 != 0) {
printf("%d ", arr[i]);
}
}
}
void even(int* arr, int len) {
printf("짝수 출력: ");
for (int i = 0; i < len; ++i) {
if (arr[i] % 2 == 0) {
printf("%d ", arr[i]);
}
}
}
int main() {
int arr[10] = { 0 };
for (int i = 0; i < 10; ++i) {
scanf("%d", &arr[i]);
}
odd(arr, 10); // 길이가 10이라고 주어졌기 때문에 len을 10으로 지정
printf("\n");
even(arr, 10); // 길이가 주어지지 않았다면 sizeof 사용하여 길이 구하기
}
|
cs |
도전2
프로그램 사용자로부터 10진수 형태로 정수를 하나 입력 받은 다음, 이를 2진수로 변환해서 출력하는 프로그램을 작성해 보자.
힌트!!
10진수를 2진수로 변환하는 방법은 그 수를 계속해서 2로 나누면 됩니다.
ex) 정수 12

따라서 1100(2) 가 됩니다.
내가 작성한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
void solve(int *, int, int *);
int main() {
int bin[50] = { 0 };
int num; scanf("%d", &num);
int i = 0;
solve(bin, num, &i);
for (i=i-1; i >= 0; --i) { // bin배열이 0부터 시작이기 때문에 -1
printf("%d", bin[i]);
}
return 0;
}
void solve(int* bin, int num, int * i) {
if (num) { // num이 1이상이면 실행 아니면 종료
bin[*i] = num % 2; // 입력받은 수를 2로 나눈 나머지를 저장
num /= 2; // 입력받은 수를 2로 나눈다
*i += 1;
return solve(bin, num, i); // 재귀함수 사용
}
else return;
}
|
cs |
도전3
길이가 10인 배열을 선언하고 총 10개의 정수를 입력 받는다. 단, 입력 받은 숫자가 홀수이면 배열의 앞에서부터 채워나가고, 짝수이면 뒤에서부터 채워나가는 형식을 취하기로 하자. 따라서 사용자가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]을 입력했다면, 배열에는 [1, 3, 5, 7, 9, 10, 8, 6, 4, 2]의 순으로 저장이 되어야 한다.
힌트!!
길이가 10으로 주어졌기 때문에 홀수는 0부터 더하고, 짝수는 9부터 빼면서 배열에 입력하면 됩니다.
내가 작성한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
int main() {
int arr[10], arr_1[10];
int first = 0, last = 9; // 홀수는 앞에서부터, 짝수는 뒤에서부터 채우기 위한 변수
for (int i = 0; i < 10; ++i) {
scanf("%d", &arr[i]);
}
for (int j = 0; j < 10; ++j) {
if (arr[j] % 2 != 0) { // 홀수이면 앞쪽에 저장
arr_1[first] = arr[j];
first++;
}
else { // 짝수이면
arr_1[last] = arr[j];
last--;
}
}
for (int k = 0; k < 10; ++k) {
printf("%d ", arr_1[k]);
}
return 0;
}
|
cs |
도전4
회문(Palindrome)은 앞으로 읽으나 뒤로 읽으나 차이가 없는 단어들을 뜻한다. 예를 들어서 level, bob과 같은 단어들은 회문에 속한다. 이에 우리는 인자로 전달되는 영단어가 회문인지 아닌지를 판단해서 그 결과를 출력하는 기능의 함수를 정의하고 이에 적절한 main 함수를 정의해 보고자 한다. 단 구현의 편의를 위해서 대소문자까지 일치해야 회문으로 인정하기로 하겠다(이는 어디까지나 구현의 편의를 고려한 제약사항일 뿐이다).
힌트!!
문자열의 길이를 구할 때, <string.h> 헤더파일의 strlen을 쓰면 바로 구할 수 있습니다.
하지만, 책에서는 나중에 알려주기 때문에 사용하지 않고 다른 방법을 이용해 구합니다.
문자열이 입력될때 배열의 크기가 +1이 되는 것을 기억해보면, 마지막에 '\0' 즉, NULL이 입력되기 때문에 크기가 1 더 커졌습니다. 그래서 배열을 순차적으로 검색하면서 '\0'을 발견하면 그전까지의 길이를 구하면 됩니다.
내가 작성한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
void palindrome(char arr[], int len) {
int first = 0, last = len - 1;
while (first <= last) {
if (arr[first] != arr[last]) {
printf("회문이 아닙니다.\n");
return;
}
first++;
last--;
}
printf("회문입니다.");
return;
}
int main() {
char arr[50];
int i = 0;
scanf("%s", arr);
while (arr[i] != '\0') { // 문자열 끝에는 '\0'이 입력되기 때문에
i++; // 그전까지 입력받아 길이 구하기
}
palindrome(arr, i);
return 0;
}
|
cs |
도전5
이번에는 정렬 알고리즘을 하나 소개하고, 이것을 이용한 프로그래밍 문제를 제시하고자 한다. 정렬이란 정의된 순서에 의해서 대상을 재배치하는 것을 의미한다. 예를 들어서 길이가 5인 배열에 정수 4, 3, 5, 1, 2가 저장되어있다고 가정해보자. 이것을 오름차순(ascending order)으로 정렬하면 순서가 1, 2, 3, 4, 5로 재배치될 것이고, 내림차순(descending order)으로 정렬하면 순서가 5, 4, 3, 2, 1로 재배치될 것이다. 정렬에 대한 기본적인 개념은 누구나 가지고 있으므로 정렬에 대한 개념적인 소개는 이쯤에서 끝내기로 하겠다. 정렬 알고리즘은 그 수가 다양하다. 그런데 여기서는 가장 쉬운 버블 정렬(bubble sort) 알고리즘을 소개하고자 한다. 버블 정렬이라는 이름은 정렬되는 과정이 마치 거품이 일어나는 모습과 유사하다고 해서 붙여진 이름이다. 그럼 그림을 통해서 버블 정렬의 기본 원리를 설명하겠다.
힌트!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
void BubbleSort(int ary[], int len) {
int i, j, temp;
for (i = len - 1; i > 0; --i) { // 한번씩 정렬할때마다 마지막 원소가 정렬되었기 때문에 하나씩 값을 줄여준다
for (j = 0; j < i; ++j) {
if (ary[j] > ary[j + 1]) { // 오름차순 정렬
temp = ary[j];
ary[j] = ary[j + 1];
ary[j + 1] = temp;
}
}
}
}
int main() {
int arr[4] = { 3, 2, 4, 1 };
int i;
BubbleSort(arr, sizeof(arr) / sizeof(int));
for (i = 0; i < 4; ++i) {
printf("%d ", arr[i]);
}
return 0;
}
|
cs |
오름차순 정렬입니다.
내가 작성한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
void BubbleSort(int ary[], int len) {
int i, j, temp;
for (i = len - 1; i > 0; --i) { // 한번씩 정렬할때마다 마지막 원소가 정렬되었기 때문에 하나씩 값을 줄여준다
for (j = 0; j < i; ++j) {
if (ary[j] < ary[j + 1]) { // 내림차순 정렬
temp = ary[j];
ary[j] = ary[j + 1];
ary[j + 1] = temp;
}
}
}
}
int main() {
int arr[4] = { 3, 2, 4, 1 };
int i;
BubbleSort(arr, sizeof(arr) / sizeof(int));
for (i = 0; i < 4; ++i) {
printf("%d ", arr[i]);
}
return 0;
}
|
cs |
'열혈 C' 카테고리의 다른 글
[열혈 C] 도전! 프로그래밍3 (0) | 2020.11.21 |
---|---|
[열혈 C] 도전! 프로그래밍1 (0) | 2018.11.13 |