본문 바로가기
스터디(beakjoon)

Kotlin] 백준 2444번 문제풀이

by 김마리님 2023. 6. 7.

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

 

2444번: 별 찍기 - 7

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

www.acmicpc.net

 

 

풀이

더보기

이 문제는 별을 카운트 만큼 늘려서 찍고 -> 다시 줄어들어서 종래에 1을 찍고 함수를 끝내야 하는게 포인트이다.

 

예시처럼 5를, 줄어들기 전까지만 보자. 대신 공백 대신 숫자를 넣어보자.

1234 *

123 * * *

12 * * * * *

1 * * * * * * *

* * * * * * * * *

보면 1번줄은 4.. (5 - 1), 2번줄은 3.. (5 - 2), 3번줄은 (5- 3) .. 즉 공백은 카운트에서 줄의 숫자만큼 빼면 된다. 

별 같은 경우도 1 3 5 7 9 ..의 2의 등차수열로 올라간다. 따라서, 이를 만족하는 식은 (줄의 숫자 * 2) - 1 을 하면 2의 등차수열을 만족할 수 있다.

 

이제 줄어드는 숫자를 보자.

1 * * * * * * *

12 * * * * *

123 * * *

1234 *

 

두 가지 방식이 있겠다.

첫번째로 늘어나는 for문을 돌리고, 두번째로 줄어드는 for 문을 사용하기.

두 번째는 늘어나는 곳에서 후속 카운트(줄어드는 카운트)를 할 수 있도록 조치하고, if문을 통해서 이후 카운트(줄어드는 카운트)에 대해 분기점을 나누는 방식인데, 두 번째로 하겠다.

 

줄어드는 양은 늘어나는 양의 -1개이므로, (마지막에 공백이 없는 줄이 한 줄이므로) 카운트를 until (count * 2) - 1 로 산정한다.

공백은 6번째 줄의 경우 (6 - 5) .. 7번째 줄의 경우 (7 - 5) .. 의 식으로 현재 줄에서 입력받은 카운트 수를 제하면 된다.

별의 수의 경우, 뒤집어지기 때문에 전체 카운트에서 얼마나 멀어져있나~ 를 우선적으로 파악해야한다.

즉 최고값 - 좌표값을 해야한다. 이는 즉, (최고값 - (현재 실제 좌표 - 최고값))을 하면 되는데, 예시 카운트를 넣어보면 좀 더 편하게 이해할 수 있다. 6번째 줄의 경우 (5 - (6 - 5) = 4, 즉 4번줄과 대응되는 별의 값을 가진다. 7번째의 경우도 마찬가지, (5 - (7 - 5)) = 3, 3번줄과 대응된다. 이를 변수화 해보면 (count - (i - count)) = count * 2 - i 가 된다. 해당 숫자에 앞서 구했던 등차수열의 식을 그대로 적용한다.

 

이를 식으로 쓰면

fun main(args: Array<String>) {
    question2444()
}

fun question2444() {
    var count = readLine()!!.toInt()

    for(i in 1 until count * 2) {
       if(i <= count) {
           println("${" ".repeat(count - i)}${"*".repeat(i * 2 - 1)}")
       } else {
           println("${" ".repeat(i - count)}${"*".repeat((count * 2 - i) * 2 - 1)}")
       }
    }
}
반응형