java String을 배열 타입으로
객체에 담아서 데이터를 넣으려고 하면
여간 인덱스가 헷갈리고 불편할 수 가 없다..
이렇게 안하는 방법이 있나?
YEEEEEEEES
있고말고!
우선 이전에 나는 아래 처럼 지저분하게 코드를 짰다.
// TODO Auto-generated method stub
// Scanner inputSize = new Scanner (System.in);
// System.out.println("Type your figure's wish size(limit 1~5) : ");
// int wishSize = inputSize.nextInt();
//
// inputSize.close();
// String[][] rhombus = {{" ","*"," "}, {"*","*","*"}, {" ", "*", " "}};
// String[][] circle = {{" ********** "}, {" ************ "}, {" ************** "},
// {" ************** "}, {" **************"}, {" **************"}, {" ************** "},
// {" ************ "}, {" ********** "} };
// String[][] star = {{"☆"}, {"*","*","*"}, {" ", "*", " "}};
//
// String
//
// String stars = "**";
// String emptySpace = " ";
//
// for (int i=0;i<sect.length; i++) {
// for(int j=0; j<)
// }
//
//
// for (int i=0; i<rhombus.length; i++) {
// String[] rhombusResult = rhombus[i];
// for (int j=0; j<rhombusResult.length; j++) {
// System.out.print(rhombusResult[j] + "");
// }
// System.out.println();
// }
//
// for (int i=0; i<circle.length; i++) {
// String[] circleResult = circle[i];
// for (int j=0; j<circleResult.length; j++) {
// System.out.print(circleResult[j] + "");
// }
// System.out.println();
// 이 FOR문은 제대로 짠 코드가 아니니 대략 이런느낌으로 짰구나 감만 익히길..
// }
// }
//
음 다시봐두 지저분해..
Array문자열처럼 메소드를 다루지만 좀 더 빠르고 편하게 문자열을 출력하고 다룰 수 있는 방법을 찾다가
은규님을 통해 StringBuffer를 알게되었다.
이 메소드를 사용해서 아래와 같이 코드를 짰더니,
package threeFigure;
import java.util.Scanner;
public class ThreeFigure {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println("사이즈를 10단위로 입력하시오 : ");
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
int space = size;
int starLen = 1;
for (int i =0; i < size + 1; i++) {
for (int j = 0; j < space; j++) {
sb.append(" ");
}
for (int j = 0; j < starLen * 2; j++) {
sb.append("*");
}
if (i < Math.floor(size /2)) {
space--;
starLen++;
} else {
space++;
starLen--;
}
sb.append("\n");
}
System.out.println(sb.toString());
}
}
이거 어떻게 가능한가?
순서도를 대략 그려보니
아래와 같았다.
만약 size = 10이라면?
i = 0 일때
j = 0 < 11 참
StringBuffer[] = " "
j = j + 1
j = 1 < 11 참
StringBuffer[] = " "
..
j = 10 < 11 참
StringBuffer[] = " "
..
j = 11 < 11 거짓
for문종료
---------------------------------
그다음 for문
j = 0 < 2 참
StringBuffer[] = " *"
j = j + 1
j = 1 < 2 참
StringBuffer[] = " **"
j = j + 1
j = 2 < 2 거짓
for문 종료
---------------------------------
현재 i=1, space = size = 10이므로
i = 1 < 5.0 = (10/2) 참이므로
space - 1 = 10 - 1 = 9로 값을 바꿔주고, //여기서 주의할꺼 size가 9가아니라 space가 9가된다.
starkLen + 1 = 1 + 1 = 2로 값을 바꿔준다.
---------------------------------
그리고 \n을 아래 버퍼스트링에 추가해주면 출력시 자동 줄바꿈이된다.
StringBuffer[] = " **\n"
---------------------------------
그다음 i = 1 < 9+1 참이므로 //여기서 주의할꺼 size가 9가아니라 space가 9가된다.
i = i + 1 = 1 + 1 = 2,
j = 0 < 11 참
StringBuffer[] = " **\n " //결국 하나의 긴 1차원배열이다.
j = j + 1
j = 1 < 11 참
StringBuffer[] = " **\n "
..
j = 9< 10 참
StringBuffer[] = " **\n " //공백문자는 총 9개가 들어간다.
..
j = 10 < 10 거짓
for문종료
---------------------------------
그다음 for문 이때 starLen = 2라는점 유의
j = 0 < 4 = (2 * 2) = (starLen * 2) 참
StringBuffer[] = " **\n *"
j = j + 1
j = 1 < 4 참
StringBuffer[] = " **\n **"
j = j + 1
j = 2 < 4 참
StringBuffer[] = " **\n ***"
j = j + 1
j = 3 < 4 참
StringBuffer[] = " **\n ****"
j = j + 1
j = 4 < 4 거짓
for문 종료
---------------------------------
그리고 또 다시 \n을 아래 버퍼스트링에 추가해주면 출력시 자동 줄바꿈이된다.
StringBuffer[] = " **\n ****\n"
---------------------------------
현재 i=2, size = 9이므로
i = 2 < 4.0 = Math.floor(9/2 = 4.5) 참이므로
size - 1 = 9 - 1 = 8로 값을 바꿔주고,
starLen + 1 = 2 + 1 = 3로 값을 바꿔준다.
....
---------------------------------
그럼 언제? if 조건문이 거짓이 될까?
계산해보자
for문과 조건문 기준으로 size와 starLen 값의 변화를 살펴보자
size = 10
starLen = 1
i = 0 ** 2*1=2
size = 10 // 앗 잠시만.. space만 바뀌는거지 size는 바뀌지 않는다.
starLen = 2
---------------------------------
i = 1 **** 2*2=4
size = 10
starLen = 3
---------------------------------
i = 2 ****** 2*3=6
size = 10
starLen = 4
---------------------------------
i = 3 ******** 2*4=8
size = 10
starLen = 5
---------------------------------
i = 4 ********** 2*5=10
size = 10
starLen = 6
// i = 4 < 5 = (Math.floor(10/2))
---------------------------------
i = 5 ************ 2*6=12
// i = 5 < 5 = (Math.floor(10/2)) 거짓이므로
size = 10
다시 starLen = 5이되고,
---------------------------------
i = 6부턴
다시 space = 7이된다.
위지점이 바로 아래 그림에 표시된 부분이다.
Copyright ⓒ 2021 by bluevulpe All Contents cannot be copied without permission.
'{Java}' 카테고리의 다른 글
21.07.30{코딩일기} <java> try catch문과 while 조건문 문법 (0) | 2021.07.30 |
---|---|
21.07.30{코딩일기} java 예외처리 InputMismatchException 예시코드 (0) | 2021.07.30 |
21.07.26{코딩일기} math.floor란? java 실수 자료형 정수형변환 메소드 math (0) | 2021.07.26 |
21.07.18{코딩일기} 컴퓨터가 참이라고 확신하게 만드는 근거조작방법 (0) | 2021.07.19 |
21.07.18{코딩일기} 컴퓨터 사고회로와 디버깅 상관관계 | 진릿값판단근거 'AND' 'OR' 'NOT' 연산자 (0) | 2021.07.19 |
댓글