별찍기 연습(지그재그&대칭)

bonnie·2021년 12월 30일
0

🟢 알고리즘 풀이

목록 보기
5/27

문제

숫자를 입력 받아 아래와 같은 모양으로 별 찍기

지그재그

대칭

풀이(지그재그)

우선 지그재그 모양은 첫번째 줄과 두번째 줄을 하나의 for문으로 돌린다.(한 묶음이라 생각), 첫번째 줄 첫번째 칸은 *로 시작하고, 그다음이 공백이 채워지며, 두번째 줄 두번째 칸은 공백으로 시작해 윗줄과 반대로 출력이 된다.
첫번째 for문에서 입력받은 num의 2배수까지 반복 실행한다. 그리고 홀수번째 케이스와 짝수번째 케이스를 나누어 그 안에서 다시 for문을 돌린다.
i가 0일 때에는 ②번 for문을 실행하고 i가 1일 때는 ①번 for문을 실행한다. 그리고 if문이 끝난 후 한 줄을 띄워주면 위와 같은 모양을 얻을 수 있다.

코드(지그재그)

import java.util.Scanner;

public class stamp_stars {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();

		for (int i = 0; i < num * 2; i++) {
			if(i % 2 == 1) {for(int j = 1; j <= num; j++) {
					if(j % 2 == 0) {
						System.out.print("*");
					}else {
						System.out.print(" ");
					}
				}
			}else {for(int j = 1; j <= num; j++) {
					if(j % 2 == 1) {
						System.out.print("*");
					}else {
						System.out.print(" ");
					}
				}
			}
			System.out.println();
		}
	}
}

풀이(대칭)

먼저 대칭으로 만들 삼각형의 줄 수를 입력 받는다.
전체 줄 수는 입력받은 숫자의 2배수 보다 하나 작은 수이기 때문에 (num*2)-1까지 for문을 돌린다.
삼각형의 모양을 보면 num이 7일 때, 0~6번째 줄까지는 역삼각형이고 i가 num보다 커지는 순간부터 정삼각형이 만들어지기 때문에 if문으로 체크 해준다.
각 줄을 보면 첫번째 줄은 13개, 두번째 줄은 공백을 포함해 12개~대칭점까지는 7개가 되고 그 이후에는 한개씩 늘어난다. 그리고 별의 개수는 13, 11, 9..2개씩 감소하고 공백은 앞쪽에서 하나씩 증가한다.
이렇게 생각했을 때 num=7인 경우,

i식(num-i)*2-1
0(7-0)*2-1 = 13
1(7-1)*2-1 = 11
2(7-2)*2-1 = 9

i가 0일 때, 첫번째 if문으로 들어가 두 개의 for문을 모두 도는데, ①번 for문은 조건이 성립되지 않기 때문에 pass, ②번 for문으로 들어가 을 찍어준다. i가 1일 때는 ①번 for문에서 앞쪽에 공백을 찍어주고 ②번 for문에서 (num-i)2-1 만큼의 *을 찍어준다.
이렇게 대칭점까지 찍어주면 else문으로 넘어가게 되고 ①번,②번 for문과 반대로 ③번, ④번 for문을 만들어주면 대칭되는 별찍기를 완성할 수 있다.

코드(대칭)

import java.util.Scanner;

public class stamp_symmetric_stars {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
        
		for(int i = 0; i < (num*2)-1; i++) {
			if(i < num) {for(int j = 0; j < i; j++) {
					System.out.print(" ");
				}for(int j = 0; j < (num-i)*2-1; j++) {
					System.out.print("*");
				}
				System.out.println();
			}else {for(int j = 0; j < (num-1)*2-i; j++) {
					System.out.print(" ");
				}for(int j = 0; j < (i+1-num)*2+1; j++) {
					System.out.print("*");
				}
				System.out.println();
			}
		}
	}
}

마무리

예전에 했던 것을 다시 정리하기 위해서 오랜만에 보는데,,,,어렵다,,,여전히 어렵다ㅠㅠㅠㅠㅠ다시 꼼꼼하게 정리해보자.....😫

profile
괴발🐱개발🐶

0개의 댓글