일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 코딩공부
- 지산동카페
- 개발자
- 동성로핫플
- 애드센스
- 안드로이드개발
- 애드몹
- 대구카페
- 동성로맛집
- 수성구맛집
- 파이썬
- 안드로이드스튜디오
- 어플개발
- 대구맛집
- 감성카페
- Android
- 코딩
- 동성로카페
- 의무경찰
- 앱개발
- 안드로이드
- androidstudio
- 범물동
- 대구인스타핫플
- 인스타핫플
- 대구핫플
- 안드로이드앱개발
- 안드로이드앱
- 수성구카페
- 범물동카페
- Today
- Total
Glacier's Daily Log
Java) 자바프로그래밍 반복문 패턴출력 형태 연습하기 본문
JavaProgramming
자바프로그래밍 중간고사 대비 패턴출력 문제 풀어보기
2학년 전공수업으로 듣고있는 자바프로그래밍.
중간고사 공부중 패턴출력 반복문 예제를 풀어보고 포스팅 해보려고 한다.
1) 반복문 패턴 만들기
1-1) 숫자 다이아몬드 만들기
이런 다이아몬드 형태를 만들기 위해서는
위의 삼각형 코드 / 아래 역삼각형 코드를 나누어서 작성해야 한다.
import java.util.*;
class PT1{
public static void main(String[] args){
int a = 7;
for(int i=0; i<a/2+1; i++){
for(int j=0; j<=a/2-i; j++) System.out.print(" ");
for(int j=0; j<i*2-1; j++) System.out.print(j+1);
System.out.println();
}
for(int i=0; i<a/2+1; i++){
for(int j=0; j<i; j++) System.out.print(" ");
for(int j=0; j<a-i*2; j++) System.out.print(j+1);
System.out.println();
}
}
}
for문 두개를 활용해서, 위의 for문은 삼각형 모양
밑의 for문은 역삼각형 모양을 나타낸다.
위의 삼각형 형태에서는 공백이 a/2-i 개 만큼, 그리고 숫자가 i*2-1개 만큼 있다.
그래서 다중for문을 활용해서 만들어주면
이까지가 만들어진다.
그리고 밑부분 삼각형은 반대로 생각해주면 된다.
공백은 i만큼
숫자는 a-(i*2) 만큼
따라서 이런 형태가 나온다.
이렇게 한 행마다의 일반항을 만들어주고
for문 범위에 넣어주면
내가 원하는 모양이 나온다.
2) 나비모양 별(*) 출력하기
위에서 다이아몬드형을 출력하는 법을 알게 되었으니
이제 조금 심화? 된 나비모양을 만들어 보자.
우선, 문제를 접하고 머릿속으로 어떻게 코드를 짜야할지 생각해본다.
우선, 첫번째 행을 보고 생각해보면
별 하나를 출력하는 for문 하나,
공백을 출력하는 for문 하나,
별 하나를 출력하는 for문 하나
이렇게 총 3개의 반복문이 필요하다.
그리고 행을 쌓아 가다가
중간의 공백이 없는 포문은 따로 처리해주려고 한다.
다중for문이 아닌, 그냥 라인의 갯수만큼 별을 출력해주고
이제 밑의 부분은 다시, 첫번째 코드를 반대로 뒤집어서 생각해주는
총 큰 for문 3개로 이루어진 코드로 작성해보려 한다.
우선
이 부분을 만들어 보자.
라인이 총 13개니까, 입력값을 13으로 두고 시작한다.
//나비출력
int z = 13;
for(int i=1; i<=z/2; i++){
for(int j=0; j<i; j++) System.out.print("*");
for(int j=0; j<z-2*i; j++) System.out.print(" ");
for(int j=0; j<i; j++) System.out.print("*");
System.out.println();
}
큰 for문의 범위는, 입력값을 2로 나눈 몫이다.
왜냐하면 밑의 부분과, 중간의 공백 없는 부분은 뺐기 때문이다.
별을 i개 만큼 출력해주고 사이에 일반항 z-(2*i) 만큼의 공백을 출력해주면
해당 모양이 나온다.
이렇게 일반항을 생각해놓으면 빨리 만들어 볼 수 있다.
그리고 이 중간의 일자 모양.
이 모양을 다이아몬드 코드때 했던 것 처럼, 위/아래로 나눠서 윗부분 코드에 넣어줘도 될것 같지만
중간 부분은 갯수가 맞지 않는다.
그래서 위/중간/아래 이렇게 3개로 나누어서 작성했다.
이렇게 3개로 나누면 위/아래는 완벽한 대칭이 되기 때문에 알아보기가 쉬워진다.
for(int i=0; i<z; i++){
System.out.print("*");
}
이렇게 매우 간단하게 z의 수만큼 별을 출력해준다.
그러면 이제 이모양 까지는 만들어 진 것이다.
남은 밑부분을 완성해보자.
윗부분 코드의 대칭으로 생각하면 편하다.
앞부분 별 일반항 : (z/2)-i+1
중간 공백 일반항 : (i*2)-1
뒷부분 별 일반항 : (z/2)-i+1
이렇게 일반항을 세우고, 다중 for문에 대입해보면
for(int i=1; i<=z/2; i++){
for(int j=0; j<z/2-i+1; j++) System.out.print("*");
for(int j=0; j<i*2-1; j++) System.out.print(" ");
for(int j=0; j<z/2-i+1; j++) System.out.print("*");
System.out.println();
}
이런 코드가 나온다.
그래서 이때까지 작성한 코드를 모아보면
//나비출력
int z = 13;
for(int i=1; i<=z/2; i++){
for(int j=0; j<i; j++) System.out.print("*");
for(int j=0; j<z-2*i; j++) System.out.print(" ");
for(int j=0; j<i; j++) System.out.print("*");
System.out.println();
}
for(int i=0; i<z; i++){
System.out.print("*");
}
System.out.println();
for(int i=1; i<=z/2; i++){
for(int j=0; j<z/2-i+1; j++) System.out.print("*");
for(int j=0; j<i*2-1; j++) System.out.print(" ");
for(int j=0; j<z/2-i+1; j++) System.out.print("*");
System.out.println();
}
이러한 코드가 나오고, 실행해보면
이렇게 완벽하게 출력되는 모습을 볼 수 있다.
3) 숫자 대칭 다이아몬드 패턴 출력
이제 연습을 충분히 해 보았으니 난이도가 많이 높은 문제.
숫자 대칭 다이아몬드 패턴
우선, 1번의 숫자 다이아몬드와는 많이 다르다.
어떻게 시작해야할지 생각해보자.
두 번 째 행을 보면, 공백 + 숫자 + 숫자 로 이루어진다.
이렇게 4개로 나누어서 보는것이다.
그러면, 윗부분 코드를 짜보자.
int p = 9;
for(int i=1; i<=p/2+1; i++){
for(int j=0; j<p/2-i+1; j++) System.out.print(" ");
for(int j=0; j<i; j++) System.out.print(i-j-1);
for(int j=0; j<i-1; j++) System.out.print(j+1);
System.out.println();
}
9개의 라인을 입력받는다고 하고,
우선 윗부분은 p/2+1 만큼의 라인을 담당한다.
그리고 다중for문을 통해
공백은 p/2-i+1 만큼 출력
그리고 i개만큼의 i-j-1 을 출력,
그리고 i-1 개 만큼의 j+1 을 출력
이렇게 총 3개를 출력해준다.
여기서 "i개만큼의 i-j-1 을 출력" 이부분이 생각하기 엄청 어려웠는데
또 막상 다시 보면 간단한 알고리즘이다.
밑부분은
for(int i=1; i<=p/2; i++){
for(int j=0; j<i; j++) System.out.print(" ");
for(int j=0; j<p/2-i; j++) System.out.print(p/2-i-j);
for(int j=0; j<p/2-i+1; j++) System.out.print(j);
System.out.println();
}
윗부분의 대칭이라고 생각해서
범위를 바꿔주면 된다.
그래서 최종 코드는
int p = 9;
for(int i=1; i<=p/2+1; i++){
for(int j=0; j<p/2-i+1; j++) System.out.print(" ");
for(int j=0; j<i; j++) System.out.print(i-j-1);
for(int j=0; j<i-1; j++) System.out.print(j+1);
System.out.println();
}
for(int i=1; i<=p/2; i++){
for(int j=0; j<i; j++) System.out.print(" ");
for(int j=0; j<p/2-i; j++) System.out.print(p/2-i-j);
for(int j=0; j<p/2-i+1; j++) System.out.print(j);
System.out.println();
}
이렇게 생각보다 간단하게 나온다.
이렇게 총 3개의 반복문 문제를 풀어봤다.
생각보다 난이도가 많이 높아서 걱정된다.
조금 더 연습해보아야겠다 :0,,,