스마트인재개발원에서 자바를 공부한지 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 |
이건 ... 음 정말 ... 수학의 승리 같았다. 나한테 수학적 사고가 정말 많이 필요하구나를 느꼈고, 딱히 좋은 팁이나 기술은 없지만 정말 이 글이 보일 때마다 수학 생각을 해야겠다. 이전에 이진수 풀이 할 때도 조금은 느꼈는데 이 문제에서 좀 크게 느낀 것 같다.
독후 기록 : 이펙티브 자바 (0) | 2022.06.05 |
---|---|
자바 +찍기 1탄 코드 퀴즈 (0) | 2021.12.16 |
Java 다중 for 문 초보자를 팁! (0) | 2021.11.25 |
댓글 영역