https://www.acmicpc.net/problem/2444
풀이
이 문제는 별을 카운트 만큼 늘려서 찍고 -> 다시 줄어들어서 종래에 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)}")
}
}
}
'스터디(beakjoon)' 카테고리의 다른 글
Kotlin] 백준 1157번 문제풀이 (0) | 2023.06.08 |
---|---|
Kotlin] 백준 4344번 문제풀이 (0) | 2023.06.08 |
Kotlin] 백준 10988번 문제풀이 (0) | 2023.06.07 |
Kotlin] 백준 25083번 문제풀이 (0) | 2023.06.02 |
Kotlin] 백준 3003번 문제풀이 (0) | 2023.06.02 |