ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2444 별 찍기 - 7 - [알고리즘] [kotlin]
    알고리즘/백준 2023. 7. 31. 01:50

    문제 내용

    문제 분석

    1. n을 입력받는다.

    2. n번째 줄까지는 별이 2개씩 늘어난다.

    3. n+1번째부터는 별이 1개가 될때까지 줄어든다.

    4. 별들은 가운데 정렬되어야 한다.

    5. 별을 그리고 남는 우측 공간에는 공백이 그려지지 않았다.

     

    아이디어

    1. 별들이 가운데 정렬되어야 하므로 별이 가장 넓은(가장 많은) 개수를 알아야 한다.

    // 1 + 2*n

    2. 줄마다 들어가야 할 공백의 개수를 계산 후 별을 그린다.

     

    추가 아이디어

    1. 위, 아래 형태가 반복되어 매번 계산하지 않는 방법을 생각해봤다.

    2. n-1번째 줄까지 별을 찍는다.

    3. n번째 줄에서 n개의 별을 찍기 전 모양을 따로 저장한다.

    4. n개의 별을 찍은 후 따로 저장했던 모양을 뒤집어 출력한다.

     

    풀이

    fun solve1() { // brute force - 140ms
        val n = readln().toInt()
        val maxStar = 1+2*(n-1)
        // 왼쪽 공간의 크기
        val leftSpace = maxStar/2
        val sb = StringBuilder()
    
    
        fun getEmptySpaceCount(star: Int): Int {
            // star개의 별을 그릴 때 먼저 찍어야 하는 공백의 개수 반환
            return leftSpace - star/2
        }
        fun drawStar(star: Int) {
            val space = getEmptySpaceCount(star)
            repeat(space) {
                sb.append(' ')
            }
            repeat(star) {
                sb.append('*')
            }
            sb.append('\n')
        }
    
        // 별이 증가하는 구간
        for(line in 0 until n-1) {
            // 이번 라인에 그려야 하는 별의 수
            val star = 1 + 2*line
            drawStar(star)
        }
        // n번째줄
        drawStar(maxStar)
        // 별이 감소하는 구간
        for(line in n-2 downTo 0) {
            // 이번 라인에 그려야 하는 별의 수
            val star = 1 + 2*line
            drawStar(star)
        }
    
        // 마지막 개행문자 제거
        sb.dropLast(1)
        print(sb.toString())
    }
    fun solve2() { // 절반의 모양 기록 후 이용하기 - 132ms
        val n = readln().toInt()
        val maxStar = 1+2*(n-1)
        // 왼쪽 공간의 크기
        val leftSpace = maxStar/2
        val starList = mutableListOf<String>()
    
    
        fun getEmptySpaceCount(star: Int): Int {
            // star개의 별을 그릴 때 먼저 찍어야 하는 공백의 개수 반환
            return leftSpace - star/2
        }
        fun recordStar(star: Int) {
            val space = getEmptySpaceCount(star)
            val sb = StringBuilder()
            repeat(space) {
                sb.append(' ')
            }
            repeat(star) {
                sb.append('*')
            }
            sb.append('\n')
            starList.add(sb.toString())
        }
    
        // 1~n번째줄까지의 별모양을 기록함
        for(line in 0 until n) {
            // 이번 라인에 그려야 하는 별의 수
            val star = 1 + 2*line
            recordStar(star)
        }
    
        val sb = StringBuilder()
        // 저장된 별모양을 1 ~ n순서대로 그림
        for(i in 0 until n) {
            sb.append(starList[i]).append('\n')
        }
        // 저장된 별모양을 n-1 ~ 0 순서로 그림
        for(i in n-2 downTo 0) {
            sb.append(starList[i]).append('\n')
        }
    
        print(sb.toString())
    }
Designed by Tistory.