💙 들어가며
별찍기 문제는 짝꿍1호님으로부터 영감을 얻어서 풀게되었다.
여기서는 단순히 문제와 풀이식만 나열되어 있을 뿐이니,
더 자세한 풀이방법에 대한 이미지와 설명은 아래 링크를 통해서 확인하는 것을 추천한다.
아래 링크에서 그림을 보고 이미지를 연상하여 푸는 것이 엄청난 도움이 되었다.
▶ BeastIT님의 블로그(https://beastit.tistory.com/49)
✏️ 다양한 *별 찍기* 문제들
Q1. 다음의 모양대로 콘솔에 출력해보자. (삼각형)
⭕ 풀이:
i가 한 바퀴 돌 때마다
j의 반복횟수가 1부터 1회씩 증가한다.
for(int i=0; i<5; i++) {
for(int j=0; j<(1+i); j++)
System.out.printf("*");
System.out.println();
}//for i
Q2. 다음의 모양대로 콘솔에 출력해보자. (상하반전)
⭕ 풀이:
i가 한 바퀴 돌 때마다
j의 반복횟수가 5부터 1회씩 감소한다.
for(int i=0; i<5; i++) {
for(int j=0; j<(5-i); j++)
System.out.printf("*");
System.out.println();
}//for i
Q3. 다음의 모양대로 콘솔에 출력해보자. (좌우반전)
⭕ 풀이:
i가 한 바퀴 돌 때마다
(공백)j의 반복횟수가 4부터 1회씩 감소한다.
(별)k의 반복횟수가 1부터 1회씩 증가한다.
for(int i=0; i<5; i++) {
for(int j=0; j<(4-i); j++) //공백
System.out.printf(" ");
for(int k=0; k<(1+i); k++) //별(*)
System.out.printf("*");
System.out.println();
}//for i
⭕ 번외(if~else):
for(k)를 빼고 대신에 for(j)안에 if~else를 추가하였다.
j의 반복횟수를 5회로 고정하고,
j가 1회 반복될 때마다 4회에서 1회씩 줄어들게 공백을 출력한 뒤
나머지는 반복되는 동안에는 *을 출력하였다.
for(int i=0; i<5; i++) {
for(int j=0; j<5; j++)
if(j<(4-i))
System.out.print(" ");
else
System.out.print("*");
System.out.println();
}//for i
Q4. 다음의 모양대로 콘솔에 출력해보자. (피라미드)
⭕ 풀이:
i가 한 바퀴 돌 때마다
(공백)j의 반복횟수가 4부터 1회씩 감소한다.
(별)k의 반복횟수가 1부터 2회씩 증가한다.
★배운 핵심내용★ 뒤에 공백은 신경쓸 필요 없다!
for(int i=0; i<5; i++) {
for(int j=0; j<(4-i); j++)
System.out.print(" ");
for(int k=0; k<(1+2*i); k++)
System.out.print("*");
System.out.println();
}//for i
⭕ 번외(if~else):
for(k)를 빼고 대신에 for(j)안에 if~else를 추가하였다.
j의 반복횟수를 i가 반복할 때마다
처음 5회에서 계속 늘어나게 설정하고,
j가 1회 반복될 때마다 4회에서 1회씩 줄어들게 공백을 출력한 뒤
나머지는 반복되는 동안에는 *을 출력하였다.
for(int i=0; i<5; i++) {
for(int j=0; j<5+i; j++)
if(j<(4-i))
System.out.print(" ");
else
System.out.print("*");
System.out.println();
}//for i
Q5. 다음의 모양대로 콘솔에 출력해보자. (다이아몬드)
⭕ 풀이:
앞서 풀었던 문제와 같은 내용의 for~for~for을
조건만 조금 다르게 해서 2번 사용해주면 된다.
for(int i=0; i<4; i++) {
for(int j=0; j<(3-i); j++) //공백 3에서 1씩 줄어듬
System.out.print(" ");
for(int j=0; j<1+(2*i); j++) //별 1에서 2씩 늘어남
System.out.print("*");
System.out.println();
}//for i
for(int k=0; k<3; k++) {
for(int l=0; l<1+k; l++)
System.out.print(" "); //공백 1에서 1씩 늘어남
for(int l=0; l<5-(2*k); l++)
System.out.print("*"); //별 5에서 2씩 줄어듬
System.out.println();
}//for k
⭕ 번외(if~else):
큰 for(i)는 4번, for(k)는 3번씩 반복시키고
작은 for(j)는 최대 7번이 반복될 수 있게
작은 for(l)은 최대 6번이 반복될 수 있게 하였다.
for(int i=0; i<4; i++) {
for(int j=0; j<4+i; j++)
if(j<3-i) //공백이 3개에서 1개씩 줄어듬
System.out.print(" ");
else //나머지 값은 다 *로 출력
System.out.print("*");
System.out.println();
}//for i
for(int k=0; k<3; k++) {
for(int l=0; l<6-k; l++)
if(l<1+k) //공백이 1개에서 1개씩 늘어남
System.out.print(" ");
else //나머지 값은 다 *로 출력
System.out.print("*");
System.out.println();
}//for k
💙 배운점
1.
이 문제를 풀면서 메타인지에 도움이 많이 되었다.
처음 간단한 별을 찍을 때는 반복문이 어렵게 느껴졌다.
같은 문제라도 if~else로 표현했을 때 좀 더 쉽게 표현할 수 있는 느낌이었다.
그 이유로 반복문이 낯설고 if가 더 친숙해서 그런거라 생각했다.
그러나 피라미드를 찍는 단계 이상이 되면 오히려 반복문이 훨씬 더 편했다.
if~else로 하려니 인덱스 2개를 가지고 더 복잡하게 생각해야 했기 때문이다.
덕분에 지금 내가 헷갈리는 것은 반복문이라기 보다 인덱스라는 것을 깨닫게 되었다.
🚨 for로 쓰면 반복되는 부분을 나눌 수 있음
(EX) for(for~for)처럼 큰 for안에서는 병렬적으로 표현하니까
늘어나는 for와 줄어드는 for 2개 각각 나눠서 표현이 가능하고
인덱스를 별개로 활용할 수 있어서 덜 헷갈림
🚨 if~else문 쓰면 최대 몇 회까지 반복해야 하는 지를 고려해야 함
(EX) 일단 기본적으로 for(for(if))로 2개의 for에 종속적이 되어버리니까
for안에서 최대로 몇 회까지 반복될 수 있는지를 따로 계산해야하고
2개의 인덱스로 명시해야 해서 많아질수록 계산 복잡해짐... (심지어 설명도 못하겠음)
2.
여하튼 현재 내 분수에 넘치는 연습문제들을 풀어보면서(..ㅎㅎ..) 깨달은 것이 있다면
반복되는 횟수(인덱스 활용)와 순서가 정말 중요하다는 것인데,
특히 조건문에서는 순서가 결과 도출에 정말 많은 영향을 미치는 것 같았다.
순서에 조금 더 신경쓰는 버릇을 들여야겠다.
break(~까지)나 continue(~부터)를 활용하여 어떤 값을 출력하려고 하는 경우에는
출력 메소드 위에 두어서 흐름을 제어하는 것이 개인적으로 효율적이어 보였다. 잘 활용해야겠다.
여러번 반복해서 말하지만 for 반복문에서는 무조건 인덱스이다.
고정되는 값과 움직이는 값을 잘 찾아서 인덱스를 잘 활용하는 것이 for문의 핵심인 것 같다.
if와 for, 그리고 while문까지 능수능란하게 다루는 날이 오길 고대하며
하루하루 열심히 풀어봐야겠다.