PS(Problem Solving)/BOJ

[백준/BOJ] 2445번: 별 찍기 - 8

JunsuKim 2021. 11. 20.
728x90

https://www.acmicpc.net/problem/2445

 

2445번: 별 찍기 - 8

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

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

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

출력

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

예제 입력1

5

예제 출력1

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

해설

예제를 보면 행은 9줄, 열은 10줄이 있다.

따라서 우선 이중 for문을 만들어 행은 n * 2 - 1만큼 루프를 만들고, 열은 n * 2의 루프를 만든다.

이제 별이 찍힌 규칙을 살펴보자.

우선 행 값이 n보다 작을 때와 클 때로 구분하였다.

0, 1, 2, 3, 4행을 보면 열 값이 행 값보다 작거나 같을 때와 n * 2 - 행 값 - 1보다 클 때 별이 찍히는 것을 볼 수 있다.

이제 5, 6, 7, 8행을 보자.

위와 똑같지만 행 값이 n보다 커졌기 때문에 식을 고쳐야 한다.

열 값이 n * 2 - 행 값 - 1보다 작을 때, n * 2 - (n * 2 - 행 값)보다 클 때 별이 찍힌다.

이를 토대로 코드를 만들면 다음과 같다.

소스 코드

import java.lang.StringBuilder

fun main() {
    val n = readLine()!!.toInt()
    val sb = StringBuilder()
    for(i in 0 until n * 2 - 1){
        for(j in 0 until n * 2){
            if(i < n) {
                when {
                    j <= i -> sb.append("*")
                    j >= n * 2 - i - 1 -> sb.append("*")
                    else -> sb.append(" ")
                }
            }
            else {
                when {
                    j < n * 2 - i - 1 -> sb.append("*")
                    j > n * 2 - (n * 2 - i) -> sb.append("*")
                    else -> sb.append(" ")
                }
            }
        }
        sb.append("\n")
    }
    println(sb.toString())
}
728x90

댓글