꿈꾸는 개발자, Front-end Developer

Trust that the dots will connect in your future.

#CSS #Dev #EJS #HTML #Hexo #JavaScript #dev #jQuery #smallTalk #번역 #삽질 #신세계 #이론 #정보처리기사

알고리즘, 1-2+3-4+5-6+...+49 구하기


정보처리기사 실기 기출 문제들 중에는 홀수와 짝수를 이용한 것들이 꽤 있고, 홀수와 짝수를 표현하는 방법이 여러 가지가 있어서 그 방법들을 따로 정리 해보려 합니다.

또한 다른 작업을 번갈아 가며 할 때 사용하는 알고리즘에 대해 간단히 알아보겠습니다.


기본 사항

  • 홀수는 영어로 Odd number, 짝수는 영어로 Even number로 표현합니다. 줄여서 Odd, Even으로 적기도 합니다.

  • 홀수나 짝수에 2를 더하면 그대로 홀수, 짝수가 됩니다.

  • 어떤 수를 2로 나누었을 때 나머지가 0이라면 그 수는 짝수입니다. 반대로 2로 나누어 떨어지지 않는 수는 홀수입니다.

  • %연산자는 나머지를 구합니다.

    예) 7%2는 7을 2로 나누었을 때의 나머지를 구하는 식이고 그 결과값은 1입니다.

    순서도에서 이를 MOD(7, 2)라고 표현하기도 합니다. MOD함수는 괄호 안에 (나누어질 수, 나눌 수)를 적습니다.

  • C와 같은 프로그래밍 언어에서는 숫자를 담는 변수를 선언할 때 실수와 정수를 구분하여 선언합니다.

    정수(integer)는 자연수와 이들의 음수, 그리고 0으로 이루어진 수 체계를 말합니다.

    쉽게 말해 소수점 이하가 없는 수를 일컫습니다. 2/3, 7/11 혹은 3.14와 같은 수는 정수가 아닙니다.

    실수(real)은 소수점 이하를 포함한 수 체계를 말합니다. 즉 실수가 더 큰 개념이며 정수는 실수 안에 포함됩니다.

  • 정수 변수는 줄여서 int로 표현합니다. 21억이 넘는 정수는 long으로 표현하지만 시험 외적인 부분이므로 생략하겠습니다.

    예) int A = 1

  • 실수 변수는 줄여서 float으로 표현합니다. 마찬가지로 엄~청 큰 실수는 double로 표현하지만 넘어가겠습니다.

    예) float B = 1.84


홀수와 짝수를 표현하는 방법들

1 - 2 + 3 - 4 + 5 - 6 + … + 49 구하기

1-2+3-4+5-6+...+49의 결과를 구하는 알고리즘 식을 구해보겠습니다.

규칙을 살펴보면,

  1. (부호를 무시한 채) 숫자가 1부터 1씩 증가

  2. 번갈아가며 뺄셈과 덧셈을 반복

    -> 짝수에는 - 뺄셈을, 홀수에는 + 덧셈을

1씩 증가하는 변수 1과 그 변수의 합을 누적할 변수 2가 필요합니다.

변수 1이 짝수일 때는 뺄셈을 하게 만들고, 반대로 홀수일 때는 덧셈을 하도록 만들면 위 식을 만족할 것으로 보입니다.


순서도로 나타내면 다음과 같습니다.

250

A % 2의 값이 0이라면 짝수를 의미하므로 SUM = SUM - A 연산을 수행하고,

A % 2의 값이 0이 아니라면 홀수를 의미하므로 SUM = SUM + A 연산을 수행하게 됩니다.

MOD(A, 2)A % 2와 같은 의미입니다.


이를 C로 나타내면 다음과 같습니다.

#include <stdio.h>
main()
{
int A;
int SUM;
A = 0;
SUM = 0;
while( A < 49 ){
A++;
if( A%2 == 0 ){
SUM = SUM - A;
} else {
SUM = SUM + A;
}
}
printf("%d", SUM);
}

다른 방식으로 홀수, 짝수를 구해보기

위 식을 보시면 A와 SUM 변수를 선언할 때 변수 이름 앞에 int를 붙여 변수의 종류를 정해주었습니다.

앞서 말씀드렸다시피 int를 앞에 붙여 변수를 선언하면 이 변수는 오직 정수만을 값으로 담습니다.

예컨대 int A라는 변수에 1.5를 정의하면 1.5는 정수가 아닌 실수이므로 변수 A는 1.5가 아닌 정수로 변환된 1을 갖습니다.

소수점 이하는 내림으로 처리합니다. 예컨대 실수 1.9도 정수 1로 처리합니다.


마찬가지로 3%2는 1.5이지만 int 변수에 정의하면 1로 처리되기 때문에 이를 이용하여 홀수, 짝수 구하는 식을 표현할 수 있습니다.

위의 식에서 if( A%2 == 0 ) 대신 if( A/2 == (float)(A/2) )으로 바꿔도 그 결과는 같습니다.

바뀐 우항 부분을 해석해보자면,

float( )은 괄호 안의 수를 실수로 표현합니다. 따라서 좌항은 정수 A/2이고 우항은 실수 A/2입니다.

예컨대, 변수 A에 3이 입력되었을 때 좌항은 정수만을 표현하므로 1을, 우항은 실수이기 때문에 1.5를 결과값으로 갖습니다.

만약 변수 A에 4가 입력되었을 때는 2로 나누어 떨어지기 때문에 좌항도 2, 우항도 2를 결과값으로 갖습니다.

결국 A에 홀수가 입력되었을 때는 A/2의 정수값과 실수값이 달라지게 되고 짝수가 입력되었을 때는 같은 값을 갖게 됩니다.


이를 C로 표현하면 다음과 같습니다.

#include <stdio.h>
main()
{
int A;
int SUM;
A = 0;
SUM = 0;
while( A < 49 ){
A++;
if( A%2 == (float(A%2) ){
SUM = SUM - A;
} else {
SUM = SUM + A;
}
}
printf("%d", SUM);
}

이를 응용한 다른 표현도 있습니다.

A == A/2 * 2

문득 보기에는 2로 나눈뒤 2를 다시 곱하니 의미없는 연산이라 여길 수도 있지만, 마찬가지로 int 변수 특성으로 인해 입력되는 변수 값에 따라 다른 결과 값을 갖습니다.

똑같은 예로 3이 입력되었을 때 좌항의 값은 3, 우항은 3/2, 즉 1.5 * 2가 아닌 1 * 2인 2를 값으로 갖습니다.

즉 홀수일 때는 각 항의 값이 달라져 조건문은 false 값을, 짝수일 때는 각 항의 값이 같으므로 true 값을 갖게 됩니다.

선언한 변수의 종류를 주의깊게 살펴볼 필요가 있겠습니다.



번갈아 가며 다른 작업하기

1 - 2 + 3 - 4 + 5와 같은 식은 변화하는 숫자가 연속적이기 때문에 홀수와 짝수를 이용할 수 있었습니다.

만약 홀수와 짝수의 규칙을 사용할 수 없거나 사용하지 않고 다른 방법을 쓰고자 한다면 변수 하나를 추가하여

다른 작업을 번갈아가며 처리하는 알고리즘을 짤 수 있습니다.


먼저 순서도로 표현하면 아래와 같습니다.

250

변수 SWITCH를 추가하였습니다. 이 변수는 위의 알고리즘 상 단순히 1과 0의 값만을 갖습니다.

오직 역할은 이전에 했던 작업을 반복하지 않고, 다른 작업을 번갈아 가며 할 수 있도록 안내하는 것입니다.

순서도를 살펴보면 최초에 SWITCH 값은 0입니다. 조건문에서 SWITCH 값이 0이냐고 묻고 있고

그 값이 0이므로 YES 방향의 작업을 수행합니다.

그리고 다시 SWITCH 값을 1로 정의하기 때문에 다음 반복 시행에서는 NO 방향의 작업을 수행하고 이를 계속 반복하게 됩니다.


이를 JavaScript로 표현하면 다음과 같습니다.

function switchTutorial(){
var A = 0;
var SUM = 0;
var SWITCH = 0;
while (A < 49) {
A++
if(SWITCH == 0){
SUM = SUM + A;
SWITCH = 1;
} else {
SUM = SUM - A;
SWITCH = 0;
}
}
return console.log(SUM);
}
switchTutorial();

SWITCH 변수를 이용한 방법은 다른 여러 알고리즘 식에도 자주 사용되니 잘 익혀두면 도움이 될 것 같습니다.

이상입니다 :)


* 오류가 있다면 알려주세요. 큰 도움이 됩니다! *

#JavaScript #이론 #정보처리기사