today_is
[ for ] 별찍기 - 심화 본문
오늘의 목표 >>
이번에는 개수 변화 규칙이 2개인 별찍기를 해보자
Quiz 01 > 마름모 모양
_ _ * _ _
_ * * * _
* * * * *
_ * * * _
_ _ * _ _
변화를 파악하기 쉽게,
공백을 _(언더바)로 처리해서 풀어보자 !!
package star;
public class Ex02 {
public static void main(String[] args) {
// 횟수를 제어할 변수를 미리 만들어 두고
// 내가 직접 횟수를 변경, 제어
// _ _ * _ _ 공백 별 공백
// _ * * * _ 2 1 2
// * * * * * 1 3 1
// _ * * * _ 0 5 0
// _ _ * _ _
int size = 5; // 5 x 5 칸
int sp = 2; // 공백 ★★★ sp = size / 2
int st = 1; // 문자
for (int i = 0; i < size; i++) { // 전체 사이즈 ( 칸 수 )
for(int j = 0; j < sp; j++) { // 공백
System.out.print("_ ");
}
for(int j = 0; j < st; j++) { // 별
System.out.print("* ");
}
for(int j = 0; j < sp; j++) { // 공백
System.out.print("_ ");
}
System.out.println(); // 한줄 출력 끝나면 줄 바꿈
if(i < size / 2) { // 전체 중에서 가운데 줄에 도달하지 못했다면 (= 윗부분)
sp -= 1;
st += 2;
}
else { // 가운데에 위치한 줄이거나 아랫쪽이라면
sp += 1;
st -= 2;
}
}
}
}
Quiz 02 > 나비 넥타이
* _ _ _ *
* * _ * *
* * * * *
* * _ * *
* _ _ _ *
package star;
public class Ex04 {
public static void main(String[] args) {
// 별(1) 공백 별(2)
// # _ _ _ # 1 3 1
// # # # # 2 1 2
// # # # # # 3 -1 3 --> if 로 처리
// # # # # 2 1 2
// # # 1 3 1
// 규칙 >> += 1 += 2 += 1
// -= 1 -= 2 -= 1
// 첫줄
int size = 5; // 사이즈
int st = 1; // 별
int sp = size - st * 2; // 공백
for(int i = 0; i < size; i++) { // 전체 칸
// 무조건 for문에서는 출력할 개수에만 신경쓰기
for (int j = 0; j < st; j++) { // 별 1 0, 1, 2
System.out.print("* ");
}
for (int j = 0; j < sp; j++) { // 공백
System.out.print("_ ");
}
for (int j = 0; j < st ; j++) { // 별 2 0, 2, 4
System.out.print("* ");
if (i == size / 2 && j == 0) { // 가운데 줄이면서 j 반복의 첫번째에서만
j++; // j를 한번 더 증가
}
}
System.out.println(); // 한줄 끝나면 한줄 띄우기
if (i < size / 2) { // 윗줄 (전체의 절반보다 작을때)
sp -= 2;
st += 1;
}
else { // 아랫줄
sp += 2;
st -= 1;
}
}
}
}
별이 두번 나와야하기 때문에 j 를 두번 사용해주어야한다.
행에서 출력되는 순서를 보면
별(1) -> 공백 -> 별(2) 이기 때문에 j 를 세번 사용하면서, 순서에 맞게 j for 문을 만든다.
또한 나비넥타이는 가운데 줄에 주목하여 문제를 풀어야한다.
가운데 줄만 다시 살펴보자 !
가운데 줄은 별만 5개 나오고, 공백은 나오지 않아야한다.
그러나 앞 줄과의 별 개수 변화를 보면 ,
별의 개수가 3개가 되기 때문에, 6개의 별이 출력된다.
원하는 결과값은 별이 5개가 되는 것인데 이를 위해서는 j를 +1 시켜서 j가 1부터 시작하여 출력되도록 하여야한다.
즉, 3번 반복할 j 를 2번만 반복하게 만드는 것이다.
이것은 별(1)에만 적용시켜서
별(1)을 2로 만들고 별(2)는 3으로 그대로 두어, 총 5개가 출력되도록 하자.
study_review >>
변화 규칙이 2개이기 때문에, 변화 구조를 파악하기 좀 더 어려웠다.
특히나, 가운데 줄에 대한 처리에서 어려움을 크게 느꼈는데
j for 문의 역할을 떠올리면서 문제를 풀려고 노력했다.
j for문은 별과 공백을 출력하는 역할이라는 것을 잊지말자 !!
'java' 카테고리의 다른 글
[ exception ] 예외 처리 (0) | 2023.12.03 |
---|---|
[ function ] (0) | 2023.12.01 |
[ for ] 별찍기 (0) | 2023.11.30 |
[ 프로그래머스 java ] 신규 아이디 추천 (Lv.1) (0) | 2023.11.27 |
[ String ] Luhn 알고리즘 & string 함수 (0) | 2023.11.22 |