ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정보처리기사 알고리즘 초급 완전정복(1부터100까지 곱하기)
    program_language 및 궁금한것/알고리즘 2019. 3. 9. 17:33

    최근 정보처리기사 실기 시험을 위해 알고리즘 공부를 시작했다.

    초급편부터 정리해 보도록 하겠다. 


    풀어나가는 과정은 각기 다를수 있으니 참고만 하면 될것같다. 하지만 결과값은 맞아야 한다. 


    1 ~100까지의 합계 = 5050


    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args) {
            int sum = 0;
            for (int i = 0; i <= 100; i++) {
                // i=i+1;
                sum = sum + i;
            }
            System.out.println("1부터 100까지 합계" + sum);
            mod();
        }
    cs


    1 ~100까지의 짝수의 합계 = 2550


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void mod() {
     
            int sum = 0;
     
            for (int i = 0; i <= 100; i++) {
                int r = i % 2;
                if (r == 0) {
                    sum = sum + i;
                }
            }
            System.out.println("1부터 100까지 짝수 합" + sum);
        }
    cs


    1~100까지 홀수의 합계 = 2500


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void modNum() {
     
            int sum = 0;
     
            for (int i = 0; i <= 100; i++) {
     
                if (i % 2 != 0) {
                    sum = sum + i;
                }
            }
            System.out.println("1부터 100까지 홀수 합" + sum);
        }
    cs


    1-2+3-4+5-6 .....+99-100 = -50


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public void aa() {
            int sum1 = 0// 짝수
            int sum2 = 0// 홀수
            int r = 0;
            for (int i = 1; i <= 100; i++) {
     
                if (i % 2 == 0) {
                    sum1 = sum1 + i;
                } else {
                    sum2 = sum2 + i;
                }
            }
            r = sum2 - sum1;
            System.out.println("어려븐것 총합계" + r);
        }
    cs
    이전문제는 쉽게 풀었지만 이 문제를 마주했을때, 아.. 이게 알고리즘이구나 라는 생각이 들었다.
    순서도를 보면 다른 방식으로 푸는 사람이 아주 많다. 위에서 말했지만 나는 내 방식대로 알고리즘을 구성했다.

    내가 풀었던 방법
    위의 식을 보니 홀수 앞엔 +가 붙고 짝수 앞엔 - 가 붙는다 .
    그래서 홀수 총합-짝수 총합을 하면 답이 나올거라 생각했다.

    1+2+4+7+11+16+….+46 = 231


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void bb2() { // 합계 1+2+4+7+11...+46
     
            int n = 1;
            int h = 1;
     
            for (int i = 1; i <= 10; i++) {
     
                n = n + i;
                h = h + n;
     
            }
            System.out.println("1+2+4+7+11...+46 = "+h);
        }
    cs
    이 문제도 어려웠다.. 순서도를 그대로 따라 타이핑 했다.

    1+3+6+10+15+….열번째항까지 = 220


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void cc() {
            int n = 0;
            int h = 0;
     
            for (int i = 1; i <= 10; i++) {
                n = n + i;
                h = h + n;
     
            }
            System.out.println("1+3+6+10+15+….="+h);
        }
    cs
    이하생략.. ㅎㅎ

    1x2x3x4x5x….100번째 항까지 곱하기= 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void mm() {    //1x2x3x4x5x…100까지 곱하기
     
            BigInteger h = new BigInteger("1");
            BigInteger b = null;
            for (int i = 1; i < 100; i++) {
                b = new BigInteger(String.valueOf(i));
                h = h.multiply(b);
                // h = h * i;
                System.out.println(i+"번째" + h);
            }
            System.out.println("1x2x3x4x5x…100까지 곱하기 = " + h);
        }
    cs

    우와 이건 .. int로 하니 숫자 표현 범위가 적어서 최종값이 0으로 나오기에 BigInteger를 사용했다.


    1/2+2/3+3/4+…+49/50 = 45.500794661670554

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void modd() { // 1/2+3/4+....49/50
     
            double a = 0;
            System.out.println(1 / 2);
     
            for (double i = 1; i < 50; i++) {
                a = a + i / (i + 1);
                System.out.println(a);
            }
            System.out.println("mod: " + a);
        }
    cs


    소수이기에 int로 변수 선언시 0으로 출력이 된다.

    float이나 double로 선언해야 한다. float은 소수점 길이가 더 짧게 나온다. 


    1 + 1 + 2 + 3 + 5 + 8 + 13 + ……의 순서로 나열되는 피보나치수열의 10번째 항까지의 합계를 구하는 순서도를 작성하시오(결과값=144) 



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public void fibonacci() { // 피보나치 수열
            // 1 + 1 + 2 + 3 + 5 + 8 + 13 + ……의 순서로 나열되는 피보나치수열의 10번째 항까지의 합계
            int fn1 = 1;
            int fn2 = 1;
            int fn3 = 0;
            for (int i = 1; i <= 10; i++) {
                // sum = (i - 1) + (i - 2);
     
                fn3 = fn1 + fn2; // i -1값을 넣어야 함
                fn1 = fn2;
                fn2 = fn3;
     
                System.out.println("피보나치" + fn3);
            }
            System.out.println("피보나치수열합 = " + fn3);
        }
    cs

    하 피보나치  ㅜㅜ

    fn의 n번째 값= fn(n-1번째)+fn(n-2번째)값,

    내 짐작인데 위의 이유때문에 fn1,2값도 1로 시작하는것 같다.

    위의 식을 쓰려면 fn(n-2번째)값이 존재해야 하니 1이 아닐까..

    몇시간을 보다가 반복문 안에 값을 변수안에 담는게 헷갈려서 찾아보다 완성했다.

    피보나치의 개념 한번 꼭 읽어보시고 풀어보시길 추천!


    ps. 해보다해보다 안되면 정답보는게 난 기억에 더 잘남는다 .. ㅠㅠ



    드디어 초급 끝이다!

    반응형

    댓글

Designed by Tistory.