https://www.acmicpc.net/problem/10993
10993번: 별 찍기 - 18
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
www.acmicpc.net

이번문제는 위 처럼 규칙을 갖게 별을 찍는 문제입니다.
저는 평범하게 배열에 저장해서 규칙에 맞게 별을 넣었습니다.
풀이의 사고 과정
0. N을 입력받았을 때 전체 갯수에 점화식 구하기
1. 배열에 저장하여 풀지, 그냥 print할지 결정
2. 규칙 발견하고 기준을 잡기
3. 각 규칙마다 다르게 로직을 생각하기
4. 구현
순으로 문제를 풀었습니다.
입력숫자가 짝홀수 일때 로직을 다르게 하였고
그리는 순서는 꼭지점을 기준으로 그리게 하였습니다.
빗변과 밑변을 그리는 로직을 생각했고
다음 삼각형을 그릴때 꼭지점의 위치를 넘겨서 그리게 했습니다.
주의할점으로는 배열 전체를 출력하는게 아니라 마지막 점만 출력한다는 것입니다.
코드가 더러운데 참고 부탁드립니다.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.StringBuilder
lateinit var arr: Array<Array<Char>>
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
var N = br.readLine().toInt()
val sb = StringBuilder()
var sum = 1
var init = 2
for(i in 2..N) {
sum+=2*init
init *= 2
}
arr = Array(sum/2+1){Array(sum+1){' '} }
if(N==1) {
System.out.print("*")
return
}
if(N%2==0) {
star(N,sum/2,sum/2, sum/2)
for(i in 0..sum/2){
for(j in 0..sum-i){
sb.append(arr[i][j])
}
sb.append("\n")
}
}
else {
star(N,0,sum/2, sum/2+1)
for(i in 0..sum/2){
for(j in 0..sum/2+i){
sb.append(arr[i][j])
}
sb.append("\n")
}
}
System.out.print(sb.toString())
}
fun star(depth:Int, row: Int, col: Int, len: Int){
if(len==1) {
arr[row][col]='*'
return
}
if(depth%2==0){
for(i in 0..len-1){
arr[row-i][col-i]='*'
arr[row-i][col+i]='*'
}
for(i in col-len..col+len){
arr[row-len][i]='*'
}
star(depth-1,row-len+1,col,len/2)
}else{
for(i in 0..len-1){
arr[row+i][col-i]='*'
arr[row+i][col+i]='*'
}
for(i in col-len..col+len){
if(i<0) continue
arr[row+len-1][i]='*'
}
star(depth-1,row+len-2,col,len/2-1)
}
}
'PS > 백준' 카테고리의 다른 글
[백준 12100] 2048 (Easy) (0) | 2021.10.04 |
---|---|
[백준 14906] 스러피 (0) | 2021.09.22 |
[백준 10997] 별 찍기 - 22 (0) | 2021.09.19 |
[백준 9370] 미확인 도착지 (0) | 2021.08.09 |
[백준 2283] 구간 자르기 (0) | 2021.07.27 |
댓글