알고리즘, 배열에서 특정 수와 가장 가까운 수 구하기
만약 4, 6, 12, 32, 54, 65, 71의 수들 중에서 46과 가장 가까운 수는 무엇일까요?
가장 적은 차이가 나는 54가 가장 가까운 수겠지요.
이번 글에서는 여러 가지 수 중에서 특정 수와 가장 가까운 수를 구하는 알고리즘에 대해 알아보겠습니다.
기본 사항
배열 : 특정 타입의 데이터를 담는 변수들의 묶음.
변수가 특정 타입의 데이터를 담았다면, 배열은 이들의 묶음을 말합니다.
예컨대,
[4, 6, 12, 32, 54, 65, 71]
과 같이 보통[
와]
으로 데이터들을 담고,
로 데이터들을 구분합니다.,
로 구분된 데이터들은 순서대로 각각의 주소를 갖습니다. ‘첫 번째 데이터, 두 번째 데이터’ 등으로 이해하시면 쉽습니다.위 배열의 예에서
4
가 ‘첫 번째 데이터’가 되겠네요.이를 식으로 표현하면
배열이름(주소)
가 됩니다. 예컨대A(1)
은 A배열의 첫 번째 데이터를 의미하는 것이지요.C언어에서는 순서도와 달리 주소를
[]
안에 표시합니다.예컨대, 순서도의
A(i)
은 C언어에서A[i]
로 표기합니다.정보처리기사 순서도에서 배열 주소는
1
에서 시작하지만, C언어는 배열 주소가0
부터 시작합니다.예컨대, 순서도에서 배열 A의 첫 번째 데이터 주소는
A(1)
이지만, C언어에서는A[0]
로 표시합니다.(반복문 조건의 범위가 달라지니 주의하세요!)
순서도에서 배열은 다음과 같은 방법으로 사용할 수 있습니다.
- 배열의 이름과 크기를 선언한다.
- 배열 값들을 주소와 함께 정의한다.
배열의 크기는 배열이 몇 개의 공간을 갖는지에 관한 것이고 이를 미리 정해줘야 합니다.
배열 값은 주소와 함께 해당 값을 정의하면 되는데 배열이름(주소) = 값
A(2) = 6
과 같이 정의할 수 있습니다.
마찬가지로 변수에 배열 값을 담을 때는 변수이름 = 배열이름(주소)
B = A(3)
과 같이 정의하면 됩니다.
배열에서 특정 수와 가장 가까운 수 구하기
10미만의 정수 5개를 입력 받아 배열에 저장한 뒤 그 중 3과 가장 가까운 수를 구하는 알고리즘
을 알아보겠습니다.
특정 수에 가장 가까운 수라는 것은 다른 수와의 차이보다 두 수의 차이가 적게 난다는 것을 의미합니다.
따라서 배열의 모든 값과 3과의 차이를 각각 구한 뒤 그 중 최소값을 갖는 배열 값을 찾으면 될 것입니다.
정리하자면,
- 5개의 수를 입력 받아 배열에 저장한다.
- 배열의 데이터와 3과의 차이값을 구한다.
- 차이값들을 비교하여 가장 작은 차이값, 즉 최소값을 구한다.
- 최소값을 갖는 데이터를 변수에 저장하여 출력한다.
이를 순서도로 나타내면 다음과 같습니다.
이를 C로 나타내면 다음과 같습니다.
int A[5];int MIN = 9, L, M, i;i = 0;do { scanf("%d", &A[i]); i++;} while ( i < 5);for (i = 0; i < 5; i++) { if(A[i] < 3) { L = 3 - A[i]; } else { L = A[i] - 3; } if(L < MIN){ MIN = L; M = A[i]; }}printf("%d", M);
이를 JavaScript로 나타내면 다음과 같습니다.
function closestNumber(){ var A = [1,2,5,6,8]; var MIN = 9; var L = 0; var M = 0; for(var i = 0; i < 5; i++){ if (A[i] < 3){ L = 3 - A[i]; } else { L = A[i] - 3; } if ( L < MIN ){ MIN = L; M = A[i]; } } return console.log(M);}
JavaScript에서는 임의의 배열과 값을 선언한 뒤 진행하였습니다.
이번 알고리즘은 배열을 오름차순, 혹은 내림차순으로 정렬할 때 사용하는 알고리즘과 유사하니
잘 익혀두면 정렬과 관련한 알고리즘을 익힐 때 유용할 듯 합니다.
이상입니다 :)
* 오류가 있다면 알려주세요. 큰 도움이 됩니다! *