가자공부하러!

알고리즘(5) - 병합, 스택, 배열 본문

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

알고리즘(5) - 병합, 스택, 배열

오피스엑소더스 2019. 4. 2. 11:11

목차

5-1. 병합(MERGE)

5-2. 스택(STACK)

5-3. 배열(1)-기본5행 5열

5-4. 배열(2)-직각 삼각형 만들기

5-5. 배열(3)-'ㄹ'자로 채우기




5-1. 병합(MERGE)

> 배열 A, B에는 정수가 오름차순으로 정렬되어 있다.

> 데이터는 10건 미만이다.

> 배열 A, B에서 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package Test.java;
import java.util.*;
import java.math.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        cl t = new cl();
 
        int i=0,j=0,k=0;
        
        int a[]= {2,3,5,8,9,10,12,13,0};
        int b[] = {1,3,5,6,0};
        int c[] = new int[20];
        
        for(int ii=0; ii<c.length; ii++) {
            if(a[i]<b[j]) {
                c[k]=a[i];
                i++;
                if(a[i]==0) {
                    do {
                        c[k]=b[j];
                        j++;
                        k++;
                    }while(b[j]!=0);
                    c[k]=0;
                    break;
                }
                    
            } else if(a[i]==b[j]) {
                c[k]=a[i];
                i++;
                j++;
                if(a[i]==0) {
                    do {
                        c[k]=b[j];
                        j++;
                        k++;
                    }while(b[j]!=0);
                    c[k]=0;
                    break;
                }else if(b[j]==0) {
                    do {
                        c[k]=a[i];
                        i++;
                        k++;
                    }while(a[i]!=0);
                    c[k]=0;
                    break;
                }
            } else if(a[i]>b[j]){
                c[k]=b[j];
                j++;
                if(b[j]==0) {
                    do {
                        c[k]=a[i];
                        i++;
                        k++;
                    }while(a[i]!=0);
                    c[k]=0;
                    break;
                }
            }
            k++;
        }
        t.printArr(c);
    }    
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Test.java;
 
public class cl {
    void print() {
    System.out.println("테스트입니다.");
    }    
    void printArr(int a[]) {    //배열 출력 메소드
        System.out.println("배열 출력 시작.");
        for(int printa =0; printa<a.length;printa++) {
            System.out.print(a[printa]+" ");
        }
        System.out.println(" ");    //줄바꿈
    }    
}
cs

*틀렸던 부분 : 

> 중괄호 두번 사용

> 출력부를 for문 안에 포함시켜서 break 때문에 출력부가 보이지 않음

 

교재 코드(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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h> 
 
void BB(b, c);
void CC(a, c);
void DD(c);
int i, j, k;
 
main()
{
    int a[10= { 2,3,5,8,9,10,12,13,0 };
    int b[10= { 1,3,5,6,0 };
    int c[20];
    i = 0;
    j = 0;
    k = -1;
    while (1)
    {
        k++;
        if (a[i] < b[j])
        {
            c[k] = a[i];
            i++;
            if (a[i] == 0)
                BB(b, c);
        }
        else if (a[i] == b[j])
        {
            c[k] = a[i];
            i++;
            j++;
            if (a[i] == 0)
                BB(b, c);
            else if (b[j] == 0)
                CC(a, c);
        }
        else
        {
            c[k] = b[j];
            j++;
            if (b[j] == 0)
                CC(a, c);
        }
    }
}
 
void BB(int b[10], int c[10])
{
    if (b[j] == 0)
        DD(c);
    do
    {
        k++;
        c[k] = b[j];
        j++;
    } while (b[j] != 0);
    DD(c);
}
 
void CC(int a[10], int c[10])
{
    do
    {
        k++;
        c[k] = a[i];
        i++;
    } while (a[i] != 0);
    DD(c);
}
 
void DD(int c[10])
{
    k++;
    c[k] = 0;
    exit(0);
}
cs

***교재 출판사 홈페이지에서 다운로드 받은 파일 그대로 실행해보았으나 실행안됨

입력값 : 

출력값 : 1 2 3 5 8 9 10 12 13 0 0 0 0 0 0 0 0 0 0 0

 

맨 위로



5-2. 스택(STACK)

> 5개의 요소를 갖는 1차원 배열을 스택으로 이용하는 순서도의 코드를 작성.

> 입력되는 데이터가 스택의 크기보다 커지면 "Overflow", 제거할 데이터가 없으면 "Underflow" 출력.


내 코드(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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package Test.java;
import java.util.*;
import java.math.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        cl t = new cl();
        stack s = new  stack();
        Scanner in = new Scanner(System.in);
        int p=0,temp=0,i=0;
        
        while(i<5){
        System.out.print("작업을 선택하세요(push=1/pop=2) : ");
        p=in.nextInt();
        
        if(p==1) {
            System.out.print("삽입할 정수를 입력하세요 : ");
            temp=in.nextInt();
            s.push(temp);
            i++;
        }else if(p==2){
            System.out.print("pop! : ");
            s.pop();
            i--;
        }else {
            System.out.println("잘못된 입력입니다.: ");
        }
        System.out.println(" ");        
        }
        
        s.printStack();
    }    
}
 
class stack{
    int stc[]=new int[5];
    int pnt=0;
    void push(int a){
        if(pnt>stc.length) {
            System.out.println("Overflow");
            for(int i:stc) 
                System.out.print(stc[i]+" ");
        }else {
            stc[pnt]=a;        
            pnt++;
        }        
    }
    void pop() {
        if(pnt<0) {
            System.out.println("Underflow");
            for(int i:stc) 
                System.out.print(stc[i]+" ");
        }else {
            System.out.println(pnt+"번 째 값"+stc[pnt-1]+"제거");
            stc[pnt]=0;
            pnt--;
        }
    }
    void printStack() {
        System.out.println("스택 정보를 출력합니다.");
        for(int i=0;i<5;i++)
            System.out.print(stc[i]+" ");
    }
}
cs

*틀렸던 부분 : 

> 23번 줄 pop인데도 입력값을 받게끔 작성 -> 수정

 

교재 코드(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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "pch.h"
#include <iostream>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
#define MAX 5 
int Stack[MAX];
int Top = -1;
 
int push(int ii) {
    Top++;
    if (Top >= MAX) {
        printf("Overflow \n");
        Top--;
        return -1;
    }
    Stack[Top] = ii;
    return 0;
}
 
int pop(void) {
    int r;
    if (Top < 0) {
        printf("Underflow \n");
        return -1;
    }
    r = Stack[Top];
    Top--;
    return r;
}
 
int main() {
    while (1) {
        int i, j, k;
        printf("작업을 선택하세요.:");
        scanf("%d"&j);
        if (j == 1)
        {
            printf("삽입할 숫자를 입력하세요.:");
            scanf("%d"&k);
            i = push(k);
            if (i == -1break;
        }
        else if (j == 2)
        {
            i = pop();
            if (i == -1break;
            else
                printf("제거한 자료는 %d입니다\n", i);
        }
        else break;
    }
    if (Top < 0)
        printf("스택에 자료가 없습니다.\n");
    else
    {
        printf("스택의 자료는 다음과 같습니다.\n");
        for (int i = Top; i >= 0; i--)
            printf("%10d\n", Stack[i]);
    }
}
cs


내코드 결과


교재 결과


 

맨 위로



5-3. 배열(1)-기본5행 5열


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Test.java;
 
public class TestMain {
    public static void main(String[] args) {
        int i=0,j=0,cnt=1;
        int[][] arr = new int[5][5];
        
        for(i=0;i<5;i++) {
            for(j=0;j<5;j++)
                arr[i][j]=cnt++;
        }
        
        for(i=0;i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main() {
    int i, j, k;
    int a[5][5];
    k = 0;
    
    for (i = 0; i <=4 ; i++) {
        for (j = 0; j <= 4; j++) {
            k++;
            a[i][j] = k;
        }
    }
 
    for (int x = 0; x <= 4; x++) {
        for (int y = 0; y <= 4; y++)
            printf("%3d ", a[x][y]);
        printf("\n");
    }
}
cs

입력값 :

출력값 :

 

맨 위로


5-4. 배열(2)-직각 삼각형 만들기

> 5행 5열의 배열에 다음과 같이 기억시키는 순서도를 작성하시오.

 1

 

 

 

 

 2

 3

 

 

 

 4

 5

 6

 

 

 7

 8

 9

 10

 

 11

 12

 13

 14

 15


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        int i=0,j=0,cnt=1;
        int[][] arr = new int[5][5];
        
        for(i=0;i<5;i++) {
            for(j=0;j<=i;j++)
                arr[i][j]=cnt++;
        }
        
        for(i=0;i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

 

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main() {
    int i, j, k;
    int a[5][5= { 0 };
    k = 0;
    
    for (i = 0; i <=4 ; i++) {
        for (j = 0; j <= i; j++) {
            k++;
            a[i][j] = k;
        }
    }
 
    for (int x = 0; x <= 4; x++) {
        for (int y = 0; y <= 4; y++)
            printf("%3d ", a[x][y]);
        printf("\n");
    }
}
cs


 

맨 위로


5-5. 배열(3)-'ㄹ'자로 채우기

> 5행 5열의 배열에 다음과 같이 기억시키는 코드를 작성.

>

 1

 2

3

 10

11 

12 

13 

14 

15 

20 

19 

18 

17 

16 

21 

22 

23 

24 

25


내 코드(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
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        int i=0,j=0,cnt=1;
        int[][] arr = new int[5][5];
        
        for(i=1;i<=5;i++) {
            if(i%2 == 0) {    //2의 배수인 경우
                for(j=4;j>=0;j--)
                    arr[i-1][j]=cnt++;    
            }else {
                for(j=0;j<5;j++)
                    arr[i-1][j]=cnt++;
            }
            
        }        
        for(i=0;i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

 

교재 코드(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
#include <stdio.h>
 
int main() {
    int k, L, m, n, i, j, p;
    int a[5][5= { 0 };
    k = 0;
    L = 0;
    m = 4;
    n = 1;
    for (i = 0; i <= 4; i++)
    {
        for (j = L; j != m + n; j += n)
        {
            k++;
            a[i][j] = k;
        }
        p = L;
        L = m;
        m = p;
        n *= -1;
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
}
cs


 

맨 위로

Comments