Kotlin/Kotlin 알고리즘
백준 27908번 Kalendar Kotlin 구현해보기
kimc
2023. 4. 22. 22:08
반응형
```
백준 27908번 Kalendar Kotlin 구현해 보기
```
이번 글을 통해 배워갈 내용
- 백준 27908번 풀이
https://www.acmicpc.net/problem/27908
백준 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로 묶고
함수를 쪼개면 더 좋을 것 같습니다.
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
반응형