알고리즘 :: 01-1. 알고리즘이란?
알고리즘 :: 01-1. 알고리즘이란?
알고리즘 입문 책을 읽고 학습한 내용을 담은 글입니다.
gpt에게 물어 본 알고리즘의 정의는 ‘어떤 문제를 해결하기 위한 절차나 규칙들의 집합’으로, 쉽게 말해 문제를 해결하는 명확한 단계별 방법이라고 한다.
또한 알고리즘이 되려면 다음의 조건을 만족해야 한다고 한다.
- 입력: 최소 0개 이상의 입력이 있어야 한다.
- 출력: 최소 1개 이상의 출력이 있어야 한다.
- 명확성: 각 단계는 명확해야 하며, 모호함이 없어야 한다.
- 유한성: 유한한 단계를 거쳐 반드시 종료되어야 한다.
- 효율성: 동일한 문제를 해결할 때, 가능한 한 적은 연산으로 빠르게 수행되는 것이 좋다.
세 값의 최댓값
1
2
3
4
5
6
7
8
9
10
int findMax(int num1, int num2, int num3) {
int max = num1;
if (num2 > max) {
max = num2;
}
if (num3 > max) {
max = num3;
}
return max;
}
세 값의 최솟값
1
2
3
4
5
6
7
8
9
10
int findMin(int num1, int num2, int num3) {
int min = num1;
if (num2 < min) {
min = num2;
}
if (num3 < min) {
min = num3;
}
return min;
}
세 값의 중앙값
1. 버블 정렬 활용
버블 정렬에서 힌트를 얻어 해결했지만 인자가 많아질수록 for문의 양도 많아진다는 단점이 있다. gpt에게 받은 피드백은 다음과 같다.
- 완전한 정렬이 아닐 수 있다. for 루프 2번이 충분하다고 보장되지 않는다.
- 불필요한 배열을 사용하여 메모리를 낭비한다.
- 연산이 많아지고, 최적화되지 않은 방식이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int findMidum(int num1, int num2, int num3) {
int numArr[] = {num1, num2, num3};
int midi = num1;
for (int i = 0; i < 2; i++) {
if (numArr[i] > numArr[i + 1]) {
int temp = numArr[i];
numArr[i] = numArr[i + 1];
numArr[i + 1] = temp;
}
}
for (int i = 0; i < 2; i++) {
if (numArr[i] > numArr[i + 1]) {
int temp = numArr[i];
numArr[i] = numArr[i + 1];
numArr[i + 1] = temp;
}
}
return numArr[1];
}
2. 조건식 활용
서적에 기재된 코드이다. 조건식이 중첩되어 가독성이 떨어진다고 생각했다. gpt에게 받은 피드백은 다음과 같다.
- 조건문이 많아 가독성이 떨어진다.
- 논리를 보다 단순화 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int findMidum(int num1, int num2, int num3) {
if (num1 >= num2) {
if (num2 >= num3) {
return num2;
} else if (num3 >= num1) {
return num1;
} else {
return num3;
}
}
// num2 > num1
else if (num1 > num3) {
return num1;
} else if (num3 > num2) {
return num2;
} else {
return num3;
}
}
3. 삼항연산자
gpt가 제안한 방법이다. 짧고 직관적이다. 분발해야겠다.
1
2
3
4
int findMidum(int num1, int num2, int num3) {
return num1 > num2 ? (num1 < num3 ? num1 : (num2 > num3 ? num2 : num3))
: (num2 < num3 ? num2 : (num1 > num3 ? num1 : num3));
}
1부터 n까지의 정수 합 구하기
1
2
3
4
5
6
7
int getSum(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
1부터 n까지 정수 합 구하기 + 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int getSum(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
printf("%d", i);
if (i != n) {
printf(" + ");
}
}
printf(" = %d \n", sum);
return sum;
}
/*
출력예시
getSum(3)
1 + 2 + 3 = 6
*/
단축평가
논리곱&&
의 경우 왼쪽 피연산자를 평가한 값이 0이면 오른쪽 피연산자는 평가하지 않고, 논리합||
의 경우 왼쪽 피연산자를 평가한 값이 1이면 오른쪽 피연산자를 평가하지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
int no;
printf("2자리 정수를 입력하세요. \n");
do {
printf("수: ");
scanf("%d", &no);
} while(no < 10 || no > 99);
printf("no 값: %d", no);
}
This post is licensed under CC BY 4.0 by the author.