가자공부하러!

알고리즘(3) - 배수,보수,그레이코드 등 본문

공부/정보처리기사(실기)

알고리즘(3) - 배수,보수,그레이코드 등

오피스엑소더스 2019. 3. 28. 12:31

목차

3-1. 5의 배수의 개수와 합

3-2. 7에 가장 가까운 수 구하기

3-3. 보수 구하기

3-4. 그레이 코드 변환하기 

3-5. 큰 수 더하기  




3-1. 5의 배수의 개수와 합 

> 1부터 100까지의 수 중 5의 배수의 개수와 합을 출력하는 코드 작성


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = new int[100];
        int sum=0, cnt=0;
        
        for(int i=0; i<100; i++) {    //100번 반복
            arr[i]=i+1;                //1부터 100까지 배열에 입력
            if( (arr[i] % 5== 0 ) {    //배열의 i번째 수를 5로 나눈 값의 나머지가 0이면 == 5의 배수이면?
                sum += arr[i];            //sum에 누적
                cnt++;                    //cnt변수에 +1
            }
        }
        
        System.out.println("1부터 100까지 5의 배수의 개수 : "+cnt);
        System.out.println("1부터 100까지 5의 배수의 합 : "+sum);
        
    }
}
cs

*틀렸던 부분 : 

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
 
int main(){
    int cnt, hap, mok, nmg, i;
    cnt = 0, hap = 0;
 
    for (i = 1; i <= 100; i++) {
        mok = i / 5;
        nmg = i - mok * 5;
 
        if (nmg == 0) {
            cnt++;
            hap += i;
        }
    }
    printf("%d %d", cnt,hap);
}
cs


입력값 : 

출력값 : 20 1050


3-2. 7에 가장 가까운 수 구하기 

> 10개의 1자리 양의 정수를 입력 받아 배열에 저장한 후 저장된 자료 중 7에 가장 가까운 자료를 찾는 코드 작성. 단, 자료는 1자리 정수이고 근사값이 2개인 경우에는 나중에 찾은 값을 출력


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Test.java;
import java.util.*;
import java.math.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scn = new Scanner(System.in);
        int[] arr =  {1,2,3,4,5,6,7,8,9,0};
        int cnr=9, obj=0;        //제어변수(7과 얼마나 가까운지 비교)값 초기화, 목표값 초기화
        
        System.out.println("0부터 9사이의 정수를 1개씩 입력하세요.");
        System.out.println("10이상의 정수를 입력하면 1의자리만 저장됩니다.");
        System.out.println("예) 13입력 -> 3저장");
        
        for(int i=0; i<10; i++) {    //10번 반복
            System.out.print((i+1)+"번 째 정수 입력  : ");
            arr[i]=(scn.nextInt() % 10);            //1부터 9 사이의 정수 입력 및 저장
            if( Math.abs( (7-arr[i]) ) <= cnr){
                cnr = Math.abs( (7-arr[i]) );        //제어변수 값 갱신
                obj = arr[i];                        //목표값 저장
            }
        }
        
        System.out.print("입력된 값 : ");
        for(int i=0;i<10;i++)
            System.out.print(arr[i]+" ");
        System.out.println("입력된 값 중 7과 가장 가까운 값 : "+obj);
    }
}
 
cs

*틀렸던 부분 : 

 > 22번줄 목표값 변수를 설정하지 않음(제어변수와 목표값을 구분하지 못함)


교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
 
int main() {
    int i, j, k, l, m;
    int a[10];
    int FIND = 7;
    i = -1;
 
    do {
        i++;
        scanf("%d"&a[i]);
    } while (i < 9);
    j = 9;
 
    for (k = 0; k <= 9; k++) {
        if (a[k] >= FIND)
            l = a[k] - FIND;
        else
            l = FIND - a[k];
        if (l <= j) {
            j = l;
            m = a[k];
        }        
    }
    printf("%d", m);
}
cs

입력값 : 1 2 3 4 5 6 7 8 9 

출력값 : 


3-3. 보수 구하기 

>0 또는 1로 입력되는 다섯 개의 숫자를 배열에 입력받아 1의 보수와 2의 보수를 구하는 코드 작성.


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Test.java;
import java.util.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scn = new Scanner(System.in);
        int[] arr =  {1,0,1,1,1};
        int[] arr2 = new int[5];    //1의 보수 배열
        int[] arr3 = new int[5];    //2의 보수 배열
        int i=0, j=4,c=1;
    
        for(i=0; i<5; i++) {    //10번 반복
            arr2[i]=1-arr[i];        //1의 보수 저★장
            arr3[j]=arr2[j]+c;        //2의 보수 배열 오른쪽 자리부터 arr2에 1을 더한 값 저★장
            arr3[j]=arr3[j]%2;        //2의 보수 배열에 2또는 0이 저장되어 있으면 0 1이 저장되어 있으면 1 입력
            c=arr2[j]*c;            //마지막으로 입력한 값이 1이면 자리올림수는 1, 마지막으로 입력한 값이 0이면 자리올림수는 0
            j--;
        }
        
        for(i=0;i<5;i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println(" ");
        for(i=0;i<5;i++) {
            System.out.print(arr2[i]+" ");
        }
        System.out.println(" ");
        for(i=0;i<5;i++) {
            System.out.print(arr3[i]+" ");
        }
    }
}
cs

*틀렸던 부분 : 

> 2의 보수 배열 저장하는 방법 이해 안되서 교재 코드 보고 따라함.

> 다행히 이해했음 :)

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
 
int main() {
    int a[5], b1[5], b2[5];
    int i = -1, c = 1;
 
    do {
        i++;
        scanf("%d"&a[i]);
        b1[i] = 1 - a[i];
    } while (i < 4);
 
    do {
        b2[i] = b1[i] + c;
        b2[i] = b2[i] % 2;
        c = b1[i] * c;
        i--;
    } while (i >= 0);
 
    for (int k = 0; k < 5; k++)
        printf("%d", a[k]);
    printf(" ");
    for (int k = 0; k < 5; k++)
        printf("%d", b1[k]);
    printf(" ");
    for (int k = 0; k < 5; k++)
        printf("%d", b2[k]);
}
cs

입력값 : 0 1 0 1 1 

출력값 : 01011 10100 10101


3-4. 그레이 코드 변환하기 

>

내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package Test.java;
import java.util.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        
        Scanner scn = new Scanner(System.in);
        int[] input = new int[5];
        int output[]=new int[4];
        int i=0;
        System.out.print("입력할 숫자가 이진수면 0, 그레이 코드면 1 입력 : ");
        input[0= scn.nextInt();
        System.out.println(" ");
        
        for(i=1; i<5;i++) {
            System.out.print(i+"번 째 숫자");
            input[i]=scn.nextInt();
            System.out.println(" ");
        }
        output[0]=input[1];
        
        System.out.println("입력된 숫자");
        for(i=0; i<5;i++) {
            System.out.print(input[i]+" ");
        }
        System.out.println(" ");        
        
        for(i=0; i<3;i++) {
            if(input[0]==1) {    //그레이코드인 경우 이진수로 변환
                System.out.println("그레이 코드를 이진수로 변환합니다.");
                    if(input[i+2== output[i])        //입력된 숫자와 이진수 비교
                        output[i+1]=0;
                    else
                        output[i+1]=1;
                }
            else {
            System.out.println("이진수를 그레이 코드로 변환합니다.");
                if(input[i+1== input[i+2])    //입력된 숫자와 옆 숫자 비교
                    output[i+1]=0;
                else
                    output[i+1]=1;
            }
        }
        System.out.print("출력 : ");
        for(i=0; i<4; i++) {
            System.out.print(output[i]+" ");
        }        
    }
}
cs

*틀렸던 부분 : 

> 13번 줄 input[0]에 입력값 안내를 뒤바꿔서 함(그레이0 이진수1)

> 22번 줄 input[1]을 input[0]으로 잘못계산

> 29~44번 줄 반복문을 조건문 아래로 두어서 반복문 중복 발생 -> 반복문을 위로 변경

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
 
int main() {
    int i;
    int input[5], cont[4];
 
    for (i = 0; i <= 4; i++)
        scanf("%d"&input[i]);
    cont[0= input[1];
 
    if (input[0== 1) {    //그레이 코드를 이진수로 변환
        for (i = 0; i <= 2; i++) {
            if (input[i + 2== cont[i])
                cont[i + 1= 0;
            else
                cont[i + 1= 1;
        }
    }
    else {        //이진수를 그레이코드로 변환
        for (i = 0; i <= 2; i++) {
            if (input[i + 1== input[i + 2])
                cont[i + 1= 0;
            else
                cont[i + 1= 1;
        }
    }
    if (input[0== 1)
        printf("이진수 ");
    else
        printf("그레이 코드 ");
    for (i = 0; i <= 3; i++)
        printf("%d", cont[i]);
}
cs



입력값 : 1 1 0 1 1(그레이코드)

출력값 : 1 0 1 1 (이진수)


3-5. 큰 수 더하기 

> 100건 이내의 12자리로 구성된 숫자를 더하는 코드 작성. 단, 12자리 숫자는 각 자리가 분리되어 배열에 입력된다.

> 예를 들어 999,999,999,999는 {9,9,9,9,9,9,9,9,9,9,9,9}와 같이 입력된다.

> 배열의 첫 번째 요소로 0을 입력 받으면 계산 후 결과를 출력하고 프로그램을 종료한다.

> 결과값이 들어갈 배열은 초기값으로 0이 들어 있다고 가정한다.

내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package Test.java;
import java.util.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        
        Scanner scn = new Scanner(System.in);
        int[] input = new int[12];    //입력값 배열
        int sum[]=new int[14];        //출력값 배열
        int i=0,j=0,qtt=0,rmd=0;
        String str;
        
        for(i=0;i<14;i++) {    //배열 초기화
            if(i<12)
                input[i]=0;
            sum[i]=0;
        }
        
        System.out.println("12자리 정수를 입력해주세요.(예 123456789123");
        
        for(i=0;i<100;i++) {        //출력값 배열이 14자리 이므로 100번까지만 반복입력 가능
            System.out.print(i+"번째 숫자 : ");
            str = scn.next();
            if(str.charAt(0== '0') {
                System.out.println("0이 입력되었으므로 입력을 종료합니다.");
                break;        //0이 입력되면 입력 종료
            }
            for(j=0;j<12;j++) {
                input[j]=(int)(str.charAt(j)-'0');    //입력된 값을 정수 배열에 저장
                sum[j+2]+=input[j];                    //입력된 값을 출력 배열에 누적
            }
            System.out.println("");
        }
        System.out.println(sum[13]/10);        
        for(i=13;i>0;i--) {        //출력 배열 정리
            qtt = sum[i]/10;        //최 우측 값 부터 10으로 나눈 몫 계산
            rmd = sum[i]-(qtt*10);    //최 우측 값 부터 나머지 계산
            sum[i]=rmd;                //계산된 나머지 값 저장 
            sum[i-1+= qtt;        //다음 계산할 값에 몫 누적 
        }        
        
        System.out.print("입력한 숫자의 합 : ");
        while(i<14) {
            System.out.print(sum[i++]);
        }        
    }
}
cs

*틀렸던 부분 : 

> 36번 줄에 i--를 i++로 잘못씀

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
 
int main() {
    int i, j, k, mok, nmg;
    int a[12], b[14= { 0 };
 
    while (1) {
        for (i = 0; i <= 11; i++)
            scanf("%d"&a[i]);
        if (a[0== 0)
            break;
        else
            for (i = 0; i <= 11; i++)
                b[i + 2+= a[i];
    }
 
    for (i = 13; i >=1 ; i--) {
        mok = b[i] / 10;
        nmg = b[i] - mok * 10;
        b[i] = nmg;
        b[i - 1+= mok;
    }
 
    if (b[0== 0)
        j = 1;
    else
        j = 0;
    for (i = j; i <= 13; i++)
        printf("%d", b[i]);
}
cs

입력값 : 123456789123 123456789123

출력값 : 0246913578246



맨 위로

Comments