(백준) 자바 - 2443번 별찍기 6

업데이트:

문제

첫째 줄에는 별 2×N-1개, 둘째 줄에는 별 2×N-3개, …, N번째 줄에는 별 1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

*********
 *******
  *****
   ***
    *

내 코드

맞춘코드

package com.baekjoon;

import java.util.Scanner;

public class backjoon2443 {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    int star = scanner.nextInt();

     // 첫번째 for문
    for(int i = 1 ; i <= star; i++) {
      //공백찍기
      for(int j = 1; j < i; j++) {
        System.out.print(" ");
      }
      //별찍기
      for(int k = (2*star)-(i*2-1); k > 0; k--) {
        System.out.print("*");
      }
      System.out.println();
    }
    scanner.close();
  }
}

틀린코드

Scanner scanner = new Scanner(System.in);

    int star = scanner.nextInt();

    for(int i = 1 ; i <= star; i++) {

      for(int j = 1; j < i; j++) {
        System.out.print(" ");
      }

      for(int k = 2*star-i; k > 0; k--) {
        if(k >= i) {
          System.out.print("*");
        } else {
          System.out.print(" ");
        }
      }
      System.out.println();
    }

풀이

  • 알고리즘을 풀다 화가날땐 심호흡을 한번 하고 코드와 잘 대화를 나눠보자. 컴파일러는 거짓말을 하지 않는다..
  • 첫 for문은 1로 시작한다. 별찍기 for문에서 (i*2-1) 공식이 음수가 나오지 않도록 하기 위함이다. 개인적으로 숫자를 0부터 시작시키는걸 좋아하지만 사심을 접어두자.
  • 공백찍기 for문은 0, 1, 2, 3 …. 1씩 늘어나는 형태이다. 첫 줄에서 0부터 시작하는게 중요한 포인트다. 첫 for문이 1로 시작했기에 공백찍기 for문도 1로 시작시킨다. 그리고 공식을 j < i로 하면 첫줄에 공백이 찍히지 않는다. 즉 0부터 시작하게 된다.
  • 별찍기 for문은 이미 문제에서 공식을 제시해주었다. 첫째 줄에는 별 2×N-1개, 둘째 줄에는 별 2×N-3개
    뒤의 숫자는 -1, -3, -5.. 즉 음수 홀수가 나열되고 있다. 이것을 공식화 시킨다. 그래서 최종 공식은 int k = (2*star)-(i*2-1); k > 0; k-- 가 된다.

틀린 코드의 원인

모양은 제대로 나오는데, 문제에서 제시해 준 방법대로 하지 않고 나의 창의성을(^^)넣어버려서..

분투의 흔적..

분투의 흔적

출력 형식이 잘못되었다는 에러를 받았다. 틀린 코드를 잘 보면 별찍기 for문 부분에서 if문을 써서 공백을 한번 더 찍은것이 실패 요인이였다. 앞으론 문제 말을 잘 듣도록 하자.

댓글남기기