-
[알고리즘/C언어] 수열의 합 알고리즘 (정보처리기사, 실기)Algorithm 2019. 5. 13. 14:29
정보처리기사 실기 시험에서 다뤄질만한 기초적인 알고리즘을 이 카테고리에서 쭉 정리해보려고 한다.
1. 동일한 숫자 N번 더하기
Sum = 7 + 7 + 7 + ... + NUM (NUM-10항까지의 합)
#include <stdio.h> #define NUM 10 // 기호형 상수 : 상수 -> 반드시 대문자로 표현한다. int main() { int sum = 0, cnt; for (cnt = 1; cnt <= NUM; cnt++) { // cnt = 1,NUM,1 (알고리즘) sum = sum + 7; printf("cnt=%d, sum=%d\n", cnt, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%d, sum=%d\n", cnt, sum); // 11, 70 system("pause"); return 0; }
가장 이해하기 쉬운 베이직한 방법이다.
먼저 10항까지의 합이므로 기호형 상수 NUM을 10이라고 정의하였다.
NUM은 변수와는 다르게 바뀌지 않는 값으로
함수에서 계속해서 반복적으로 사용되는 변하지 않는 값들을 정의할 때 쓴다.
cnt변수의 초기값은 1이고 10을 포함하여 반복하므로 10번 반복하게 된다.
반복문 종료 후 cnt= 11, sum= 70이 된다.
#include <stdio.h> #define NUM 10 int main() { int sum = 0, cnt; for (cnt = NUM; cnt >= 1; cnt--) { // cnt = NUM, 1, -1 sum = sum + 7; printf("cnt=%d, sum=%d\n", cnt, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%d, sum=%d\n", cnt, sum); system("pause"); return 0; }
cnt의 초기값을 10으로 주고 1보다 크거나 같을 때가지 증감시키며 반복하는 방법도 있다.
이 경우 실행결과는 아래와 같다.
#include <stdio.h> #define NUM 10 int main() { int sum = 0, cnt; for (cnt = 1; cnt < NUM+1; cnt++) { // cnt = 1, NUM+1, 1 sum = sum + 7; printf("cnt=%d, sum=%d\n", cnt, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%d, sum=%d\n", cnt, sum); system("pause"); return 0; }
첫번째 코드와 거의 같으나 <= 대신 <을 사용했으므로, NUM에 +1을 해준다.
#include <stdio.h> #define NUM 10 int main() { int sum = 0, cnt; for (cnt = 1; cnt != NUM + 1; cnt++) { sum = sum + 7; printf("cnt=%d, sum=%d\n", cnt, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%d, sum=%d\n", cnt, sum); system("pause"); return 0; }
거의 사용하지 않는 방법이지만 위와 같이 표현할 수도 있다.
결과값은 동일하다.
2. 1씩 증가하는 수열의 합
Sum = 1 + 2 + 3 + 4 + ... + NUM (NUM-10항까지의 합)
sum = 1 + 2 + 3 + 4 + ... + NUM의 규칙은
i 1 1 1
숫자가 1씩 증가하고 있다는 점이다.
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 0, i=0; for (cnt = 1; cnt <= NUM; cnt++) { i = i + 1; sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 10 system("pause"); return 0; }
위 코드의 특징은 i에 1을 더하여 sum에 i를 더해나가는데,
i = i + 1; 연산을 sum = sum + i; 연산 전에 실행한다는 점이다.
그러므로 반복문을 다 빠져나가고 난 후에도 i는 11이 아니고 10이 된다.
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 0, i = 1; for (cnt = 1; cnt <= NUM; cnt++) { sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); i = i + 1; } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 11 system("pause"); return 0; }
위와 동일한 코드에서 i의 초기값을 1로 바꾸고
i의 증감을 sum 연산 뒤에 이루어지게 한다면
반복문 종료 후 아래 사진과 같이 i는 11이 된다.
위 코드는 i대신 cnt를 sum에 더하는 것과 결과가 동일하다.
3. 1부터 N까지 홀수의 합
Sum=1+3+5+7+...+NUM (NUM-10항까지의 합)
sum = 1 + 3 + 5 + 7 + ... + NUM의 규칙은
i 2 2 2
숫자가 2씩 증가하고 있다는 점이다.
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 0, i = -1; for (cnt = 1; cnt <= NUM; cnt++) { i = i + 2; sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 19 system("pause"); return 0; }
i는 2만큼 증가해야 하므로 i = i + 2;를 해준다.
여기서 sum에 처음으로 더해야하는 수가 1이므로 i의 초기값이 -1이 되어야 1을 더할 수 있다.
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 0, i = 1; for (cnt = 1; cnt <= NUM; cnt++) { sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); i = i + 2; } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 21 system("pause"); return 0; }
만약에 i 연산을 sum연산 뒤에 실행한다면 i의 초기값은 1이 될 것이다.
[문제] 만약에 아래와 같은 상황에서 빈 칸에 들어갈 코드는 어떻게 될까?
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 1, i = [ ]; for (cnt = 1; cnt [ ] NUM; cnt++) { i = [ ]; sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 10 system("pause"); return 0; }
1) 일단 i는 2씩 증가하므로 i = i + 2;를 채워넣는다.
2) 그 다음, sum의 초기값이 0이 아니고 1이므로 sum에 3부터 더해야한다는 결론을 내릴 수 있다.
그러므로 i의 초기값은 1이 되어야한다. (i = 1 + 2 = 3을 만들어야하기 때문이다.)
3) cnt의 초기값은 1이고 원래대로라면 10번을 더해야하는데,
sum이 이미 1을 가지고 있었으므로 3부터 9번을 실행해야 한다.
1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19
그러므로 cnt < 10이 되어야 한다.
[정답]
#include <stdio.h> #define NUM 10 int main() { int cnt, sum = 1, i = 1; for (cnt = 1; cnt < NUM; cnt++) { i = i + 2; sum = sum + i; printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); } printf("----------반복문 종료-------------\n"); printf("cnt=%2d, i=%2d, sum=%5d\n", cnt, i, sum); // i = 10 system("pause"); return 0; }
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/C언어] 수열의 합 알고리즘(3) / 계차수열의 합 (정보처리기사, 실기) (0) 2019.05.20 [알고리즘/C언어] 수열의 합 알고리즘(2) / for문, while문, do-while문, goto문 (정보처리기사, 실기) (0) 2019.05.19 [알고리즘/자바스크립트] 페이지네이션 헬퍼 (Pagination Helper) (0) 2019.05.12 [알고리즘/자바스크립트] 꼬리에 붙은 0 (팩토리얼과 Trailing Zero) (0) 2019.05.12 [알고리즘/자바스크립트] 괄호 짝 찾기 (Valid Braces) (0) 2019.05.03 COMMENT