Post

알고리즘 :: 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.