상세 컨텐츠

본문 제목

Java 2차원 배열 퀴즈_다이아(?) 마름모 만들기, 그리고 수학.

Java

by Sam_Park 2021. 11. 26. 23:57

본문

[왼쪽]다이아, 아니 마름모 그림. 그나마 수학적인 느낌 나는 것으로 고름/ [오른쪽] 문제

 스마트인재개발원에서 자바를 공부한지 2주차, 2차원 배열 관련 퀴즈 숙제를 풀었다. 문제 중 마지막 문제 하나인 마름모 모양으로 숫자 출력하기가 있었는데, 그리 특별하지 않게 2시간 조금 걸린 것 같다. 어려운 문제는 그 정도 걸릴 수 있지! 암...  다른 행사와 특강으로 시간 관계상 2차원 배열에 대한 개념적인 내용만 배웠고, 퀴즈를 통한 실습을 셀프로 진행하고 있었다.

 

 그러던 중 이 문제는 좀 많이 막막했다. 상단부와 하단부를 나누면 가능은 할 것 같은데, 0 은 같은 반복 문 내에 넣기 힘들어 보였고, 상단부 하단부의 규칙은 시각적으로 피라미드 형태인 것 외에는 없어 보였다. 어떤 조건으로 쓸지 메모하면서 고민하길 20분, 다른 수업으로 쉬었다가 집에와서 30분 정도 고민하였고, 일단 써보자 싶어 일일이 입력하는 코드를 쳤다. 그 이후에서야 가능한 것만 먼저 완성하자는 생각이 들었고, 진행했다. 결국 하나씩 하나씩 수정하고 수정해서 완성은 했다.

 

먼저 2차원 배열 전체에 0을 채우고, for 문 안에 if 조건문으로 상단부 조건을 쓰고, 이중 for문을 돌리고 하단도 진행했다. 나름의 만족감을 느끼며 완성을 하고 보니 코드는 40줄, 다른 팀원의 이해를 돕기 위해 약간의 주석을 달고 숙제 완료로 공유했다. 

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
public class Ex211126_03_dia {
 
    public static void main(String[] args) {
 
        int[][] arr = new int[7][7];
        int cnt = 0;
        int n = 7;
 
        for (int i = 0; i < n; i++) { // 다 0 입력
            for (int j = 0; j < n; j++) {
                arr[i][j] = 0;
            }
        }
 
        for (int i = 0, j = 0; i < n; i++) {
 
            if (i <= 3) { // 열 시작 번호 감소 조건
                j = 3 - i;
 
                // 열번호 감소시 반복횟수 지정
                for (int k = 1; k <= i * 2 + 1; k++) { 
                    cnt++;    
                    arr[i][j] = cnt;
                    j++// 반복하는 동안 열자리 위치 변경
                }
 
            } else if (i > 3) {  // 열 시작 번호 증가 조건
                j = i - 3;
                // 열번호 증가시 반복횟수 지정
                for (int k = 1; k <= (6 - i) * 2 + 1; k++) {
                    cnt++;
                    arr[i][j] = cnt;
                    j++
                }
            }  // if 문 종료
        } // 다이아 입력 for 문 종료
 
        for(int i = 0; i < n; i++) { //0과 다이아 2차원 배열 출력
            for(int j = 0; j < n ; j ++) {
                System.out.printf("%2d ",arr[i][j]);
            }
    
cs

그런데 다른 팀원으 코드를 보고 깜짝 놀랐다. 물론 아직 수업에서 다루지 않은 절대값 함수를 썼지만, 문제를 파악해낸 규칙 자체가 달랐다. 나는 보이는대로 증감하는 규칙을 각각 보았다면 다른 친구는 중간을 기준으로 행 i 와 열j 에 각각 3을 뺀 절대값 즉, 거리의 기준으로 규칙을 파악해낸 것이다. 그리고 그 코드는 간단명료해졌다. 출력부를 제외하고 0과 값을 입력하는 내 코드는 닫는 괄호를 빼고 중간 줄 빼도 16줄이고, 그 친구 코드는 5줄이다.

1
2
3
4
5
for (int i = 0 ; i <= 6; i++) {
     for (int j = 0; j<=6; j++) {
        if (Math.abs(i-3)+Math.abs(j-3)<=3) {//Math.abs() <- 절대값
             n++;
             matrix[i][j] = n;
cs

 

이건 ... 음 정말 ... 수학의 승리 같았다. 나한테 수학적 사고가 정말 많이 필요하구나를 느꼈고, 딱히 좋은 팁이나 기술은 없지만 정말 이 글이 보일 때마다 수학 생각을 해야겠다. 이전에 이진수 풀이 할 때도 조금은 느꼈는데 이 문제에서 좀 크게 느낀 것 같다. 

 

'Java' 카테고리의 다른 글

독후 기록 : 이펙티브 자바  (0) 2022.06.05
자바 +찍기 1탄 코드 퀴즈  (0) 2021.12.16
Java 다중 for 문 초보자를 팁!  (0) 2021.11.25

관련글 더보기

댓글 영역