정보처리산업기사 실기/알고리즘

기본 알고리즘 - 수열

미웡할꺼야 2020. 11. 15. 18:46

기본 수열(1부터 100까지 자연수)

정의 : 수열은 일정한 규칙에 따라 숫자들이 차례대로 나열된 것을 말한다. 수열의 각 숫자를 항이라고 부른다.

문제 : 1부터 100까지 자연수의 합을 구하는 알고리즘을 제시하라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Sequence {
 
    public static void main(String[] args) {
        int sum = 0// 합계 변수.
        int n = 1// 수열의 항 변수.
        while(true) {
            sum = sum + n; // 수열의 현재 항 n을 누산.
            n = n + 1// 1씩 증가.
            if(n > 100break// 수열의 마지막 항까지
                               // 처리했으면 작업을 종료한다.
        }
        System.out.println(sum); // 5050
    }
}
cs

 

 


등차 수열

정의 : 각 항에 일정한 수를 더하여 다음 항을 만든다는 규칙을 갖는다. 여기에 더해지는 수를 공차라고 부른다.

문제 : 다음 등차 수열에 대하여 200번째 숫자까지의 합을 구하는 알고리즘을 제시하라(2, 8, 14, 20, 26, 32, ...).

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ArithmeticSequence {
    public static void main(String[] args) {
        int a = 2// 수열의 초항.
        int d = 6// 공차.
        int s = a; // 200번째 항까지의 합.
        int n = 2// 등차 수열의 항 순서.
        int an = 0// n번째 항 계산값.
        while(true) {
            /*
            * 2번째 항 : 2+(2-1)*6 = 8
            * 3번째 항 : 2+(3-1)*6 = 14
            * 4번째 항 : 2+(4-1)*6 = 20
             * ... a+(n-1)*d
             */
            an = a + (n - 1* d;
            s = s + an;
            n = n + 1;
            if(n > 200break// n == 201도 가능.
        }
        System.out.println(s); // 119800
    }
}
cs

 

 

 


등비 수열

정의 : 각 항에 일정한 수를 곱하여 다음 항을 만든다는 규칙을 갖는다. 곱해지는 수를 공비라고 부른다.

문제 : 다음 등비 수열에 대하여 100번째 항까지의 합을 구하는 알고리즘을 제시하라(2, 6, 18, 54, 162, 486, ...).

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class GeometricSequence {
 
    public static void main(String[] args) {
        int r = 3// 공비.
        int a = 2// 수열의 초항.
        int s = a; // 합계 변수.
        int n = 2// 등비 수열의 항 순서.
        while (true) {
            /*
             * 2번째 항 : 2*3 = 6
             * 3번째 항 : 6*3 = 18
             * 4번째 항 : 18*3 = 54
             * ... a * r
             */
            a = a * r;
            s = s + a;
            n = n + 1;
            if (n > 10)
                break// 10번째 항까지.
        }
        System.out.println(s); // 59048
    }
}
cs

 

 


피보나치 수열

정의 : 1, 1, 2, 3, 5, 8, ... 과 같이 앞의 연속된 2개 항을 합하여 새로운 항을 생성하는 수열을 말한다. 피보나치 수열의 처음 2개 항은 1, 1, 이다.

문제 : 다음 피보나치 수열에 대하여 100번째 항까지의 합을 구하는 알고리즘을 제시하라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class FibonacciNumbers {
 
    public static void main(String[] args) {
        int a = 1, b = 1// 1,2번째 항.
        int c = 0// 다음항 생성 변수.
        int s = a + b; // 합계 변수.
        int n = 2// 계산 완료된 항의 개수.
        while(true) {
            c = a + b; // 1 + 1 = 2.
            s = s + c; // 1 + 1 + 2 = 4.
            a = b; // 1 <= 1.
            b = c; // 1 <= 2.
            n = n + 1;
            if(n == 100break;
        }
        System.out.println(s); // 1445263495
    }
}
cs

 

 

 

 

 

 

 

 

 

 


누승 활용 수열

문제 : 1부터 100까지의 누승의 합 S = 1! + 2! + 3! + 4! + 5! + ... + 100!을 구하여 출력하는 알고리즘을 제시하라

(단, N!은 자연수 N에 대한 누승(Factorial)으로서 1부터 N까지의 곱을 말한다).

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FactorialSequence {
 
    public static void main(String[] args) {
        int n = 1// 인덱스 변수.
        int f = 1// n에 대한 누승 보관 변수.
        int s = 1// 합계 변수.
        while (true) {
            /*
             * 1! = 1
             * 2! = 1! * 2 = 1 * 2 = 2
             * 3! = 2! * 3 = 2 * 3 = 6
             * 4! = 3! * 4 = 6 * 4 = 24 ...
             */
            n = n + 1;
            f = f * n;
            s = s + f;
            if (n == 10// 10까지 계산 제한.
                break;
        }
        System.out.println(s); // 4037913
    }
}
 
cs

 


제곱의 합

문제 : S = (100X1)^2 + (99X2)^2 + (98X3)^2 + ... + (3X98)^2 + (2X99)^2 + (1X100)^2의 합을 구하여 출력하는 알고리즘을 제시하라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SumOfSquares {
 
    public static void main(String[] args) {
        int a = 0// 오른쪽 수.
        int b = 0// 왼쪽 수.
        int c = 0// 제곱 계산 변수.
        int s = 0// 합계 변수.
        do {
            a = a + 1// 오른쪽 수 1씩 증가.
            b = 101 - a; // 왼쪽 수 1씩 감소.
            c = b * a; // b*a = (100*1) ...
            c = c * c; // c*c = (100*1)*(100*1) ...
            s = s + c;
        } while (a < 100); // 100까지.
        System.out.println(s); // 350336680
    }
}
cs

 

 

 

 

 


"+, -" 교행 자연수 수열

문제 : S = 1 - 2 + 3 - 4 + 5 - 6 + ... - 100의 값을 구하여 출력하는 알고리즘을 제시하라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CrossingNaturalNumberSequence {
 
    public static void main(String[] args) {
        int n = 0// 증가값.
        int s = 0// 합계 변수.
        do {
            /*
             * 홀수번째 항일 경우 +
             * 짝수번째 항일 경우 -
             */
            n = n + 1;
            s = s + n; // 홀수번째 항.
            n = n + 1;
            s = s - n; // 짝수번째 항.
        } while(n != 100);
        System.out.println(s); // -50
    }
}
cs

 

 

 

 


"+, -" 교행 분수 수열

문제 : 다음과 같은 형태로 나타나는 수열의 합을 구하여 출력하는 알고리즘을 제시하라.

S = 1/(2X3) - 2/(3X4) + 3/(4X5) - 4/(5X6) + ... - 48/(49X50) + 49/(50X51)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CrossingFractionSequence {
 
    public static void main(String[] args) {
        int k = 0// 증가값.
        double s = 0// 합계 변수.
        int sw = 0// '+,-' 토글 스위치 변수.
        double l = 0// 계산값 보관 변수.
        do {
            k = k + 1;
            l = (double) k / ((k + 1* (k + 2));
 
            if (sw == 0) { // sw가 0일 때 +.
                s = s + l;
                sw = 1;
            } else { // sw가 1일 때 -.
                s = s - l;
                sw = 0;
            }
        } while (k != 49);
        System.out.println(s); // 0.08895716800226436
    }
}
cs