Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[개발자 비상근무] 버디 미션 제출합니다. #22

Open
wants to merge 2 commits into
base: stopmin-main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion kotlin-oncall/src/main/kotlin/oncall/Application.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package oncall

fun main() {
TODO("프로그램 구현")
val onCall = OnCall()
onCall.run()
}
133 changes: 133 additions & 0 deletions kotlin-oncall/src/main/kotlin/oncall/Calender.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package oncall

import java.util.Stack

class Calender {
var month: Int? = null
var startDay: Int? = null

fun setMonth(month: Int): Int {
this.month = month
return month
}

fun setStartDay(day: String) {
this.startDay = dayToInt(day)
}

fun assignEmergency(weekdayEmergency: List<String>, weekendEmergency: List<String>): Any? {
var day = 1

var weekdayTrun = 0
var weekendTrun = 0
var recentlyWorker = ""

val lastDayOfMonth = Month.entries[month!! - 1].days

val weekdayStack = Stack<String>()
val weekendStack = Stack<String>()

while (day <= lastDayOfMonth) {
val dayOfWeek = Weekday.entries[(startDay!! + day - 1) % 7]
if (dayOfWeek in Weekday.isWeekDay()) {
if (!weekdayStack.isEmpty() && weekendStack.peek() != recentlyWorker) {
recentlyWorker = weekdayStack.pop()
} else {
if (recentlyWorker == weekdayEmergency[weekdayTrun]) { // 이전과 같다
weekdayStack.push(weekdayEmergency[weekdayTrun])
weekdayTrun = addTurn(weekdayTrun, weekdayEmergency)
recentlyWorker = weekdayEmergency[weekdayTrun]
} else { // 이전과 다르다
recentlyWorker = weekdayEmergency[weekdayTrun]
weekdayTrun = addTurn(weekdayTrun, weekdayEmergency)
}
}
} else {
if (!weekendStack.isEmpty() && weekendStack.peek() != recentlyWorker) {
recentlyWorker = weekendStack.pop()
} else {
if (recentlyWorker == weekendEmergency[weekendTrun]) { // 이전과 같다
weekendStack.push(weekendEmergency[weekendTrun])
weekendTrun = addTurn(weekendTrun, weekendEmergency)
recentlyWorker = weekendEmergency[weekendTrun]
} else { // 이전과 다르다
recentlyWorker = weekendEmergency[weekendTrun]
weekendTrun = addTurn(weekendTrun, weekendEmergency)
}
}
}

println("${month}월 ${day++}일 ${dayOfWeek.description} ${recentlyWorker}")
}




return null
}

private fun dayToInt(day: String): Int = Weekday.match(day).day

private fun addTurn(turn: Int, members: List<String>): Int = (turn + 1) % members.size
}

enum class Weekday(val day: Int, val description: String) {
SUNDAY(0, "일"),
MONDAY(1, "월"),
TUESDAY(2, "화"),
WEDNESDAY(3, "수"),
THURSDAY(4, "목"),
FRIDAY(5, "금"),
SATURDAY(6, "토");

companion object {
fun match(day: String): Weekday {
return when (day) {
"일" -> SUNDAY
"월" -> MONDAY
"화" -> TUESDAY
"수" -> WEDNESDAY
"목" -> THURSDAY
"금" -> FRIDAY
"토" -> SATURDAY
else -> throw IllegalArgumentException("요일을 올바르게 입력해주세요.")
}
}


fun isWeekDay(): List<Weekday> {
return listOf(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY)
}

fun isWeekend(): List<Weekday> {
return listOf(SUNDAY, SATURDAY)
}

}
}

enum class Holiday(val month: Int, val day: Int, val description: String) {
NEW_YEAR(1, 1, "신정"),
INDEPENDENCE_MOVEMENT_DAY(3, 1, "삼일절"),
CHILDREN_DAY(5, 5, "어린이날"),
MEMORIAL_DAY(6, 6, "현충일"),
LIBERATION_DAY(8, 15, "광복절"),
NATIONAL_FOUNDATION_DAY(10, 3, "개천절"),
HANGUL_DAY(10, 9, "한글날"),
CHRISTMAS(12, 25, "성탄절")
}

enum class Month(val month: Int, val days: Int) {
JANUARY(1, 31),
FEBRUARY(2, 28),
MARCH(3, 31),
APRIL(4, 30),
MAY(5, 31),
JUNE(6, 30),
JULY(7, 31),
AUGUST(8, 31),
SEPTEMBER(9, 30),
OCTOBER(10, 31),
NOVEMBER(11, 30),
DECEMBER(12, 31)
}
29 changes: 29 additions & 0 deletions kotlin-oncall/src/main/kotlin/oncall/IOHandler.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package oncall

import camp.nextstep.edu.missionutils.Console

class IOHandler {
fun readInput(): String {
return Console.readLine() ?: ""
}

fun readMonthAndDay(): Pair<Int, String> {
print("비상 근무를 배정할 월과 시작 요일을 입력하세요> ")
val input = readInput().split(",")
return Pair(input[0].toInt(), input[1])
}

fun getWeekdayEmergency(): List<String> {
print("평일 비상 근무 순번대로 사원 닉네임을 입력하세요> ")
val input = readInput().split(",")
return input
}

fun getWeekendEmergency(): List<String> {
print("주말 비상 근무 순번대로 사원 닉네임을 입력하세요> ")
val input = readInput().split(",")
return input

}

}
22 changes: 22 additions & 0 deletions kotlin-oncall/src/main/kotlin/oncall/OnCall.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package oncall

class OnCall {
private val ioHandler: IOHandler = IOHandler()
private val calender: Calender = Calender()

fun run() {
val (month, day) = ioHandler.readMonthAndDay()

calender.setMonth(month)
calender.setStartDay(day)

// 평일 비상근무 사원
val weekdayEmergency = ioHandler.getWeekdayEmergency()
// 주말 비상근무 사원
val weekendEmergency = ioHandler.getWeekendEmergency()


// 근무 배정
val result = calender.assignEmergency(weekdayEmergency, weekendEmergency)
}
}