티스토리 뷰
인수와 출력 타입을 입력 받아 타입별로 별을 찍어 보자
단 입력은 홀수만 입력이 된다.
1. TYPE 1
한줄에 별이 입력 받은 수 만큼 출력이 되었고, 전체 줄도 입력 받은 수 만큼 출력이 된 것을 볼 수 있다.
public static void type1(int n) {
System.out.println("== Type1 ==");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println();
}
이중 for 문을 이용하여 입력 받은 수 만큼 반복문을 돌려주면 된다.
inner for문이 끝나면 줄 바꿈을 위해서 enter 를 해주어야 한다.
2. TYPE 2
입력받은 수 까지 별이 순차적으로 증가하는 형태를 가지고 있다.
public static void type2(int n) {
System.out.println("== Type2 ==");
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println();
}
3. TYPE 3
type2 와 반대 되는 삼각형 출력을 해야한다.
이때 고려할 사항은 type2 와 다르게 공백의 수를 계산해야한다는 점이다.
public static void type3(int n) {
System.out.println("== Type3 ==");
for (int i = 0; i < n; i++) {
for (int j = n-1; j >= 0; j--) {
if(i>=j){
System.out.print("*");
}
else if(i<j) {
System.out.print(" ");
}
}
System.out.println();
}
System.out.println();
}
첫번째 줄은 공백이 2개이고 3번째에 별이 1개 출력이 되어야 한다.
공백의 위치를 계산하기 위해서 j=n-1 (2) 로 초기화했다.
공백이 있어야하는 범위를 j 라고 하며, i 로 탐색을 하며 j 범위 전까지는 공백을 찍으며 j 이후에는 별을 찍도록 하였다.
4. TYPE 4
위의 모양을 분석을 해보면 첫번째 줄은 1개이고 2번째 줄은 3, 3번째 줄은 5개 이다.
n-2, n, n+2 의 규칙을 가지고 있다.
가로는 n+2 이며, 세로는 n 인것을 알 수 있다.
public static void type4(int n) {
System.out.println("== Type4 ==");
int center = (n+2) / 2;
int leftCenter = center;
int rightCenter = center;
while(true){
if(leftCenter < 0) break;
for (int i = 0; i < n+2; i++) {
if(leftCenter <= i && rightCenter>=i){
System.out.print("*");
}
else {
System.out.print(" ");
}
}
leftCenter--;
rightCenter++;
System.out.println();
}
System.out.println();
}
leftCenter 와 rightCenter 로 별이 찍혀야하는 범위를 지정하였다.
for 문이 반복 될 수록 leftCenter 는 1개씩 감소하여 왼쪽으로 가야하며, rightCenter 는 1개씩 증가하여 오른쪽으로 이동해야한다.
5. TYPE 5
public static void type5(int n) {
System.out.println("== Type5 ==");
int left = n/2 -1;
int right = n/2 + 1;
//상부
for (int i = 0; i < n/2; i++) {
for (int j = 0; j < n; j++) {
if(left < j && right > j) {
System.out.print("*");
}
else if(left > j || right > j){
System.out.print(" ");
}
}
left--;
right++;
System.out.println();
}
//중간
for (int i = 0; i < n; i++) {
System.out.print("*");
}
System.out.println();
//하부
left = 0;
right = n-1;
for (int i = 0; i < n/2; i++) {
for (int j = 0; j < n; j++) {
if(left < j && right > j) {
System.out.print("*");
}
else if(left > j || right > j){
System.out.print(" ");
}
}
left ++;
right --;
System.out.println();
}
System.out.println();
}
개인적으로 5번이 제일 까다로운 문제라고 생각한다.
이것을 한번에 출력 한다고 생각하기보다는 3단계로 나누어서 출력한다고 생각하면 조금 더 쉽게 접근 할 수 있다.
상부의 공백을 보면 첫째줄에는 000X000 center 기준으로 3개이며 둘째줄은 00XXX00 이며 center 기준으로 2개씩이고 상부의 마지막은 0XXXXX0 1개씩인 것을 알 수 있다.
이것을 범위로 나타내보면 첫째줄은 0~2 까지 공백이며 3번째 별이 찍히고 4~6 까지 공백이 찍힌다.
2째줄은 0~1까지 공백이며 2~4 까지 별이 찍히고 5~6 까지 공백이 찍힌다.
상부의 마지막 줄인 3째줄은 0 까지 공백이며 1~5 까지 별이 찍히며 6에 공백이 찍힌다.
이것을 2중 포문으로 생성했으며 왼쪽에 찍힐 최대 공백의 인덱스를 left 라고 하며 오른쪽에 처음으로 공백이 찍힐 인덱스를 right 라고 하였다.
inner for 문에서 left 와 right 의 범위를 비교하여 별을 찍도록 하였고 별이 출력될 구간이 아니면 공백을 출력 하도록 하였다.
inner for 문이 종료 되고 밖에 있는 for 문으로 나왔을 때 별이 찍힐 구간을 재 설정 해줘야 하므로 left 와 right 의 값을 변경하도록 하였다.
중간은 입력 받은 수만큼 출력 하면 된다.
하부는 상부와 동일하게 출력 했으며 단 left 와 right의 인덱스를 다르게 시작하였다.
상부는 별이 출력 될 구간이 점점 늘어났다면 하부는 별이 출력 될 구간이 좁아졌다.
이것을 고려하여 left, right 값을 설정해주었다.
다양한 형태의 별을 출력을 해보면서 type 5가 해결하는데 오래걸렸다.
별을 3단계로 나누어서 출력을 한다는 점이 key point 인 것 같다.
3단계로 나누어서 출력하고 출력을 할 부분을 범위로 지정해서 코드를 작성하니 문제가 해결되었다.
'Algorithm > Solve Problem' 카테고리의 다른 글
Java - 가상 당선 시뮬레이션 프로그램 (0) | 2022.11.07 |
---|---|
Java - 로또 당첨 프로그램 (0) | 2022.11.07 |
Askii code 를 이용한 대소문자 변환 프로그램 (0) | 2022.11.04 |
숫자 거꾸로 출력하기 (JAVA) (0) | 2022.11.04 |
JAVA - LocalDate 를 이용하여 달력 만들기 (0) | 2022.11.04 |
- Total
- Today
- Yesterday
- 코딩테스트 준비
- java
- 제로베이스 백엔드 스쿨
- 알고리즘 공부
- 백엔드 개발자 기술 면접 준비
- 백엔드 개발자
- 백엔드 개발자 취업 준비
- 제로베이스 백준 장학금
- 코딩테스트
- 코테공부
- 코테 준비
- 기술 면접 준비
- 프로그래머스
- 알고리즘
- 개발자 취준
- 프로그래머스 자바
- 프로그래머스 카카오
- 자바
- 코딩테스트 공부
- 코테준비
- 주니어 개발자 취업 준비
- 취준
- 자바공부
- 백준
- 취업 준비
- 개발자 면접 준비
- 알고리즘공부
- 취업준비
- 코딩테스트공부
- 개발자 취업 준비
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |