Kotlin/Kotlin 알고리즘

백준 27908번 Kalendar Kotlin 구현해보기

kimc 2023. 4. 22. 22:08
반응형

```

백준 27908번 Kalendar  Kotlin 구현해 보기

```

Kimc Kotlin Study

이번 글을 통해 배워갈 내용

  1. 백준 27908번 풀이

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

 

27908번: Kalendar

The first and only line contains integers $n$ and $d$ ($1 ≤ n ≤ 99$, $1 ≤ d ≤ 7$), the number of days in the month, and the day it starts with.

www.acmicpc.net

 

백준 27908번 Kalendar는

난이도 브론즈 등급의 문제로서

 

설명

한 달에 n개의 날이 있고

해당 달에 첫 시작일이 첫 주에 d번째 날일 때

달력을 텍스트로 아래와 같이 그려주면 되는 문제입니다.

 

+–––––––––––––––––––––+
|........1..2..3..4..5|
|..6..7..8..9.10.11.12|
|.13.14.15.16.17.18.19|
|.20.21.22.23.24.25.26|
|.27.28.29.30.31......|
+–––––––––––––––––––––+


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


텍스트로 달력을 그려주면 되는 간단한 문제입니다.

 

fun main() {
    val inputDto = getInput()
    print(solution(inputDto))
}

fun getInput(): InputDto {
    val inputs = readln().split(" ").map { k -> k.toInt() }
    return InputDto(numberOfDaysInMonth = inputs[0], xThDayOfTheWeek = inputs[1])
}

data class InputDto(
    var xThDayOfTheWeek: Int,
    var numberOfDaysInMonth: Int,
) {

    fun drawKalendar(): String {
        val numberOfDaysInWeek = 7
        val sb = StringBuilder()
        var lineCount = 0

        sb.append("+---------------------+\n")
        sb.append("|")
        for (i in 1 until xThDayOfTheWeek) {
            sb.append("...")
            lineCount++
        }

        for (day in 1..numberOfDaysInMonth) {
            if (lineCount == numberOfDaysInWeek) {
                sb.append("|\n|")
                lineCount = 0
            }
            lineCount++
            val dayStr =
                if (day / 10 == 0) {
                    "..$day"
                } else {
                    ".$day"
                }
            sb.append(dayStr)

        }
        if (lineCount != numberOfDaysInWeek) {
            for (i in 1..(numberOfDaysInWeek - lineCount)) {
                sb.append("...")
            }
        }

        sb.append("|\n")
        sb.append("+---------------------+")
        return sb.toString()
    }
}

fun solution(dto: InputDto): String {
    return dto.drawKalendar()
}


// https://codemasterkimc.tistory.com/

 

테스트

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

internal class MainKtTest {

    @Test
    fun test() {
        assertEquals(
            """+---------------------+
|........1..2..3..4..5|
|..6..7..8..9.10.11.12|
|.13.14.15.16.17.18.19|
|.20.21.22.23.24.25.26|
|.27.28.29.30.31......|
+---------------------+""",
            solution(
                InputDto(numberOfDaysInMonth = 31, xThDayOfTheWeek = 3)
            )
        )
        assertEquals(
            """+---------------------+
|..............1......|
+---------------------+""",
            solution(
                InputDto(numberOfDaysInMonth = 1, xThDayOfTheWeek = 5)
            )
        )
        assertEquals(
            """+---------------------+
|....................1|
|..2..3..4..5..6..7..8|
|..9.10.11.12.13.14.15|
|.16.17.18.19.20.21.22|
|.23.24.25.26.27.28...|
+---------------------+""",
            solution(
                InputDto(numberOfDaysInMonth = 28, xThDayOfTheWeek = 7)
            )
        )

        assertEquals(
            """+---------------------+
|..1..2..3..4..5..6..7|
|..8..9.10.11.12.13.14|
|.15.16.17.18.19.20.21|
|.22.23.24.25.26.27.28|
|.29.30.31.32.33.34.35|
|.36.37.38.39.40.41.42|
|.43.44.45.46.47.48.49|
|.50.51.52.53.54.55.56|
|.57.58.59.60.61.62.63|
|.64.65.66.67.68.69.70|
|.71.72.73.74.75.76.77|
|.78.79.80.81.82.83.84|
|.85.86.87.88.89.90.91|
|.92.93.94.95.96.97.98|
|.99..................|
+---------------------+""",
            solution(
                InputDto(numberOfDaysInMonth = 99, xThDayOfTheWeek = 1)
            )
        )
    }
}

 

시간이 된다면 인자를 DTO로 묶고 

함수를 쪼개면 더 좋을 것 같습니다.

 

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

반응형