별 찍기를 해보려 한다.
별 찍기는 이중 for문의 반복연산자를 조정해서 도형을 콘솔에 출력하는 것으로 만든다.
간단한 알고리즘으로 다양하게 응용할 수 있으며
사람마다 찍는 방법이나 사고하는 방법이 다를 수 있다... 나도 왕도가 아니므로
사고 연습하기 좋은 것 같다.
메인함수
public static void main(String[] args) {
STAR_01 ss = new STAR_01();
ss.triangle();
ss.halfTri();
ss.reverseTri();
ss.hexagon();
}
총 네 개의 모양을 별로 찍을 것이고,
각각 STAR_01 클래스에서 메서드를 호출해 콘솔에 찍는다.
triangle
삼각형이다. 매우 기본적인 도형이다.
꼭지점 좌 우로 한 칸씩 별이 늘어나면 삼각형이 완성이다.
꼭지점을 기준으로 i가 커지면(행이 아래로 내려가면) j가 출력하는 기준도 i에 맞게 변화 시킨다는 것이 포인트다.
void triangle() {
for(int i = 0 ; i < 5 ; i++) {
for(int j = 0; j < 9; j++) {
// 행은 5줄, 열은 9줄
int point = 4; // 중간 점을 찍어줘야 되므로 윗 꼭지점 기준이 됨
if(j >= point-i && j <= point+i) // j의 조건을 i에 맞춰서 설정
// 삼각형은 한 줄이 늘어날 때 마다 중심에서 양 옆으로 하나씩 별이 늘어남
System.out.print(" * ");
else
// j가 조건이 안 맞으면 공백 출력
System.out.print(" ");
}
System.out.println();
}
}
halfTri
반쪽짜리 삼각형이다.
꼭지점이 맨 오른쪽에서 시작하는 직각삼각형 모양이라서, 첫 j의 기준점을 맨 오른쪽으로 잡아서
하나씩 앞으로 출력되는 기준을 당긴다.
void halfTri() {
for(int i = 0 ; i < 9 ; i++) {
for(int j = 0; j < 9; j++) {
int point = 8; // 맨 오른쪽이 기준
if(j >= point-i)
// 8에서 출력 -> 7 8 출력 이런 식으로 첫 출력 번째가 앞으로 당겨짐
System.out.print(" * ");
else
System.out.print(" ");
}
System.out.println();
}
}
reverseTri
역삼각형이다.
좀 까다롭기 시작한다.
j가 출력 될 순번을 왼쪽, 오른쪽 다 정해 줘야 한다.
전설 했듯이 j의 값을 i로 계산 하는 것이 효율적이다.
j의 왼쪽은 0 에서 중간으로, j의 오른쪽은 맨 끝에서 중간으로 서로 수렴하게 되어있다.
따라서 한 행씩 내려갈 때마다(i가 커질 때 마다)
j의 왼쪽은 한 칸씩 뒤로 가서 출력하고, j의 오른쪽은 한 칸씩 앞으로 와서 출력이 끝난다.
void reverseTri() {
for(int i = 0 ; i < 5 ; i++) {
for(int j = 0; j < 9; j++) {
if(j <= 8-i && j >= i)
/*
j의 시작은 0 ~ 8 까지 다 출력이므로
i가 0이면 저 조건은 j는 8보다 작고 0보다 크면 다 출력이다.
i가 1이 되면 j는 1 ~ 7까지 출력하는 것이다.
*/
System.out.print(" * ");
else
System.out.print(" ");
}
System.out.println();
}
}
hexagon
육각형이다.
STAR_01 ss = new STAR_01();
// ss.triangle();
// ss.halfReverseTri();
// ss.reverseTri();
ss.hexagon();
// ss.star();
}
중간에 출력 방식이 변화한다.
따라서 구간마다 다른 조건을 넣어줘야 한다.
맨 윗부분은 그냥 삼각형과 같으며 i(행)만 조절해주면 된다.(i범위만 지정하면 된다는 거지)
중간은 걍 다 뽑는거니 쉽고
마지막 역삼각형은 좀 골치가 아프다 ㅎㅎ
void hexagon() {
for(int i = 0 ; i < 13 ; i++) {
// System.out.print("i = "+ i);
// if(i >= 8)
// System.out.printf("i = %d front : %d, end : %d",i,8-(i-8),i-8);
for(int j = 0; j < 9; j++) {
int point = 4; // 그냥 삼각형 뽑을 때의 꼭지점이 되는 기준
if(i <= 3) { // i가 4행까지는 걍 삼각형
if(j >= point-i && j <= point+i)
System.out.print(" * ");
else
System.out.print(" ");
} else if (i < 3 && i <= 7) { // 5행부터 8행까지는 그냥 네모
System.out.print(" * ");
} else { // 그 이후의 행은
/*
i가 0부터 시작하는 것이 아니라 이미 8까지 온 상황이므로
(i-8)로 i를 0에서부터 시작하는 것 처럼 해줌
그 후 역삼각형 뽑기
*/
if(j <= 8-(i-8) && j >= i-8)
System.out.print(" * ");
else
System.out.print(" ");
}
}
System.out.println();
}
}
클래스 전체 소스
public class STAR_01 {
void triangle() {
for(int i = 0 ; i < 5 ; i++) {
for(int j = 0; j < 9; j++) {
int point = 4;
if(j >= point-i && j <= point+i)
System.out.print(" * ");
else
System.out.print(" ");
}
System.out.println();
}
}
void reverseTri() {
for(int i = 0 ; i < 5 ; i++) {
for(int j = 0; j < 9; j++) {
if(j <= 8-i && j >= i)
System.out.print(" * ");
else
System.out.print(" ");
}
System.out.println();
}
}
void halfTri() {
for(int i = 0 ; i < 9 ; i++) {
for(int j = 0; j < 9; j++) {
int point = 8;
if(j >= point-i)
System.out.print(" * ");
else
System.out.print(" ");
}
System.out.println();
}
}
void hexagon() {
for(int i = 0 ; i < 13 ; i++) {
for(int j = 0; j < 9; j++) {
int point = 4;
if(i <= 3) {
if(j >= point-i && j <= point+i)
System.out.print(" * ");
else
System.out.print(" ");
} else if (i < 3 && i <= 7) {
System.out.print(" * ");
} else {
if(j <= 8-(i-8) && j >= i-8)
System.out.print(" * ");
else
System.out.print(" ");
}
}
System.out.println();
}
}
void star() {
for(int i = 0 ; i < 10 ; i ++) {
for(int j = 0; j < 9; j++) {
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
STAR_01 ss = new STAR_01();
ss.triangle();
System.out.println();
ss.halfTri();
System.out.println();
ss.reverseTri();
System.out.println();
ss.hexagon();
System.out.println();
}
}
STAR_01의 main 실행 결과
'JAVA > 실습' 카테고리의 다른 글
[java][실습] 006 이차원 배열에서 좌표에 X 찍기 (0) | 2020.07.05 |
---|---|
[java][실습] 005 오름차순, 내림차순으로 배열요소 정렬 (0) | 2020.07.05 |
[java][실습] 004 배열 섞기 (0) | 2020.07.05 |
[java][실습] 003 배열에서 최대값과 최소값 찾기 (0) | 2020.07.05 |
[java][실습] 001 shift 사용해 글자 추출하기 (0) | 2020.07.02 |