포스팅 OS : Mac

검색어 : 자바(Java), 배열(Array), 원(Circle), 피타고라스 정리(Pythagorean Theorem)




배열을 사용해 입력받은 정수에 따라 점점 커지는 원 그리는 방법에 대해 포스팅합니다.

여러가지 방법이 있지만 여기서는 피타고라스 정리를 사용하여 그려보겠습니다.


피타고라스 정리가 무엇인지 모르시는 분들을 위해 링크와 이미지를 올립니다.


피타고라스 정리 <-- 클릭!




자 그럼 바로 소스로 들어갑니다.


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
77
78
79
80
81
import java.util.Scanner;
 
public class Circle {
    public static void main(String[] args) {
        /* 원 그리기  */
 
        System.out.println("숫자를 입력해주세요.");
        Scanner input = new Scanner(System.in);
        
        int answer;                    // 입력받은 정수
        int heigt;                     // 총 세로 길이
        int width;                     // 총 가로 길이
        int top;                       // 상단
        int radius;                    // 반지름
        
        // 입력받은 정수 저장
        answer = input.nextInt();
        
        // 총 세로 길이 생성
        heigt = answer * 18;
        
        // 총 가로 길이 생성
        width = answer * 40;
        
        // 상단, 하단 종료 위치 지정
        top = heigt / 2;
        
        // 반지름
        radius = heigt / 2 + 1;
        
        
//        System.out.println("입력한 정수 : " + answer);     // 입력받은 정수
//        System.out.println("총 세로 길이 : " + heigt);     // 총 세로 길이
//        System.out.println("총 가로 길이 : " + width);     // 총 가로 길이
//        System.out.println("상단 : " + top);             // 상단
//        System.out.println("반지름 : " + radius);        // 반지름
        
        char[][] star = new char[heigt][width]; // 가공한 정수를 배열 생성에 사용
        
        int start = 0;            // 시작 지점 
        int end = 0;              // 종료 지점
        
        // 원 상단 생성
        for(int a = top; a > 0 ; a--){
            int bLine =(int) Math.round(Math.sqrt(Math.pow(radius - 12- Math.pow(a, 2)));  // 피타고라스 공식
            bLine = (bLine + 1* 2;                                                           // 가로 행의 중앙에서 양쪽으로 점을 찍어야 되는 거리
            
//            System.out.println(a+ "행의 길이는 " + bLine +" 입니다.");
            
            int realRow = Math.abs(a - top);       // 세로 행의 위치
            start = (width / 2- bLine;           // 가로 행의 시작 지점
            end = ((width / 2- 1+ bLine;       // 가로 행의 종료 지점
 
//            System.out.println("시작 : " + start +" / 종료 : " + end);
            
            // 배열에 원 상단 입력
            for(int b = 0 ; b < width ; b++){
                if(start <= b && b < end) {
                    star[realRow][b] = '*';
                }else {
                    star[realRow][b] = ' ';
                }
            }
        }        
        
        // 원 상단 출력
        for(int a = 0 ; a < top ; a++){
            for(int b=0 ; b < width ; b++){
                System.out.print(star[a][b]);
            }
            System.out.println();
        }
        // 원 하단 출력 (상단을 반전해서 출력)
        for(int a = top - 1 ; a >= 0 ; a--){ 
            for(int b=0 ; b < width ; b++){
                System.out.print(star[a][b]);
            }
            System.out.println();
        }
    }
}
cs



주석으로 상세하게 설명을 써놓았으니 한번 쭉 보시고 이해가 안되면 로그 찍어보시면 이해하시는데 도움이 될 것입니다.


위 소스를 실행하면 아래와 같이 원이 그려집니다.





포스팅 OS : Mac

검색어 : 자바(Java), 배열(Array), 별(Star)




오늘은 자바 기초 공부를 위해 배열을 사용해 입력받은 정수에 따라 점점 커지는 별 그리는 방법에 대해 포스팅합니다.


요즘 일이 바빠서 블로그에 관심을 가지지 못했습니다 ㅠ

그래도 짬짬히 올려보도록 하겠습니다.


그럼 소스를 보도록 하죠.

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.util.Scanner;
 
public class Star {
 
    public static void main(String[] args) {
        /* 별 그리기 - 다리 5개 */
        
        System.out.println("숫자를 입력해주세요.");
        Scanner input = new Scanner(System.in);
        
        int answer;                    // 입력받은 정수
        int heigt;                     // 별 세로 길이
        int width;                     // 별 가로 길이
        int center;                    // 가로 중간 지점
        int top;                       // 머리 종료 지점
        int middle;                    // 몸통 종료 지점
        int bottom;                    // 다리 종료 지점
        
        // 입력받은 정수 저장
        answer = input.nextInt();
        
        // 별 세로 길이 생성
        heigt = answer * 9;
        
        // 별 가로 길이 생성
        width = answer * 15;
        
        // 가로 길이가 짝수일 경우 + 1
        if(width % 2 == 0) {
            width += 1;
        }
        
        // 가로 중간 지점 생성
        center = width / 2;
        
        // 머리,몸통,다리 종료 위치 지정
        top = heigt / 3;
        middle = top * 2;
        bottom = top * 3;
        
        /*
        System.out.println("입력한 정수 = " + answer);    // 입력받은 정수
        System.out.println("총 세로 길이 = " + heigt);    // 별 세로 길이
        System.out.println("총 가로 길이 = " + width);    // 별 가로 길이
        System.out.println("가로 중간 지점 = " + center);  // 가로 중간 지점
        System.out.println("상단 = " + top);             // 상단
        System.out.println("중간 = " + middle);          // 중간
        System.out.println("하단 = " + bottom);          // 하단
        */
        
        char[][] star = new char[heigt][width]; // 별의 세로, 가로 길이로 배열 생성
        
        int start;       // 시작 지점 
        int end;         // 종료 지점
        int startBottom; // 하단 시작 지점
        int endBottom;   // 하단 종료 지점
        
        // 별 머리 생성
        start = center;
        end = center;
        for(int a = 0 ; a < top ; a++){
            for(int b = 0 ; b < width ; b++){
                if(start <= b && b <= end) {
                    star[a][b] = '*';
                }else {
                    star[a][b] = ' ';
                }
            }
            
            start--;
            end++;
        }
        
        // 별 몸통 생성
        start = 0;
        end = width - 1;
        for(int a = top ; a < middle ; a++){
            for(int b = 0 ; b < width ; b++){
                if(start <= b && b <= end) {
                    star[a][b] = '*';
                }else {
                    star[a][b] = ' ';
                }
            }
            
            start++;
            end--;
        }        
 
        // 별 다리 생성
        startBottom = center;
        endBottom = center;
        for(int a = middle ; a < bottom ; a++){
            for(int b = 0 ; b < width ; b++){
                if(startBottom <= b && b <= endBottom) {
                    star[a][b] = ' ';
                }else {
                    star[a][b] = '*';
                }
                
                if(start -1 > b || end +1 < b) {
                    star[a][b] = ' ';
                }
            }        
            
            start--;
            end++;
            startBottom -= 3;
            endBottom += 3;    
        }
        
        // 별 배열 출력
        for(int a=0 ; a < heigt ; a++){
            for(int b=0 ; b < width ; b++){
                System.out.print(star[a][b]);
            }
            System.out.println();
        }
    }
}
cs



오늘도 역시 설명은 주석으로 대체합니다.

저는 별을 머리, 몸통, 다리로 구분하여 그리는 방법을 사용했습니다. 제가 만든 별이 완벽한 별의 모양일까? 라는 의문이 들긴 하는데 좀 더 정확한 별을 그리고 싶으시다면 좀더 세세하게 셋팅하면 될 것 같네요.


위 소스를 실행하면 아래와 같이 별이 그려집니다.





다음엔 원 그리기 포스팅을 하도록 하겠습니다.


포스팅 OS : Mac

검색어 : 자바(Java), 배열(Array), 마름모(Diamond)




오늘은 자바 기초 공부를 위해 배열을 사용해 입력받은 정수에 따라 점점 커지는 마름모 그리는 방법에 대해 포스팅합니다.


이 마름모 그리기는 자바를 처음 공부하기 시작했을 때 많이들 접하는 문제인데 사실 정답은 없는 문제입니다. 여기서 정답이 없다는 것이 무슨 뜻이냐면 어떤 소스가 되었던 마름모만 그려지면 된다는 것을 의미합니다. 제가 작성한 소스가 정답은 아니라는 거죠. 누군가는 저 소스보다 더 간단하고 쉽게 마름모를 그릴 수도 있습니다. 


잠깐 잡담을 하고 가자면 개발은 본업으로 삼고 몇년째 이일을 하고 있지만 잘짜여진 소스가 일하는데 있어서 크게 중요한 것은 아닙니다. 물론 머리 좋은 사람이 보기 쉽고 짧게 작성해 놓은 소스라면 더 좋겠지만 프로젝트를 진행해나감에 있어서 일단 목표했던 기능이 제대로 구현되고 있는지가 먼저라고 생각합니다. 당연히 이것은 제 개인적인 생각입니다. 제 스타일은 그렇거든요. 일단 기능 구현 후 차차 소스를 정리해나가는 타입입니다. 처음부터 정리된 소스를 추구하는 분들도 있고 저같은 사람도 있습니다. 스타일은 중요하지 않습니다. 이 마름모 소스와 마찬가지로 뭐로 가든 일단 마름모만 그려지면 됩니다.


왜 이 긴 잡담을 했냐면 이 글을 보시는 여러분이 본인 스스로 만든 마름모 소스와 제 소스의 방법이 다르다 해서 저게 맞고 이게 틀리다 혹은 이게 맞고 저게 틀리다가 아니라는 것을 말하고 싶었습니다. 더 좋은 방법을 쓴 좋은 소스가 있다면 그것을 자신의 것으로 흡수하여 자유자재로 사용할 수 있게 제대로 소화하기만 하면 됩니다. 


잡담은 여기까지 하고 마름모 그리기 소스를 보시겠습니다. 소스에 대한 설명은 주석으로 간략하게 달아 놓았습니다. 설명을 주저리주저리 길게 써봤자 본인들 실력엔 도움이 되지 않습니다. 주석을 보고 이해가 안되는 점은 소스를 차근차근 분석해서 생각해보세요. 그 과정이 본인의 실력을 늘리는 피와 살이 됩니다.


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
import java.util.Scanner;
 
public class Diamond {
 
    public static void main(String[] args) {
        /* 마름모 그리기 */    
    
        System.out.println("숫자를 입력해주세요.");
        Scanner input = new Scanner(System.in);
        
        int answer;                    // 입력받은 정수
        int center;                    // 가운데 행
        
        // 스캐너로 정수 입력 받기
        answer = input.nextInt();   
        
        // 입력받은 정수를 가공하여 마름모가 그려질 가로, 세로 길이 구하기
        answer = answer * 2 + 1;
        
        // 가운데 행 위치 지정
        center = answer/2;
        
        // 가공한 정수를 배열 생성에 사용
        char[][] dia = new char[answer][answer]; 
        
        int start = center;    // 점을 찍을 시작 지점
        int end = center;      // 점을 찍을 종료 지점
        
        // 마름모 생성
        for(int a=0 ; a < answer ; a++){
            for(int b=0 ; b < answer ; b++){
                if(start <= b && b <= end) {
                    dia[a][b] = '*';
                }else {
                    dia[a][b] = ' ';
                }
            }
            
            // 중간에서 점 찍는 위치 반전
            if(a < center) {
                start--;
                end++;
            }else {
                start++;
                end--;
            }
        }
        
        // 마름모 배열 출력
        for(int a=0 ; a < answer ; a++){
            for(int b=0 ; b < answer ; b++){
                System.out.print(dia[a][b]);
            }
            System.out.println();
        }
    }
}
cs



위 소스를 실행하면 아래와 같이 마름모가 그려집니다.

(왼쪽 상단에 숫자는 입력한 정수 입니다.)






다음 포스팅은 점점 커지는 별 그리기 포스팅을 하도록 하겠습니다.


+ Recent posts