TIL ~ 24.04.05

20231206 TIL

wlsds00_ 2023. 12. 6. 22:11

1. 코드카타

두 수의 나눗셈

class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = 0
        
        if (0 < num1 && num2 <= 100) {
            answer = ((num1.toDouble() / num2.toDouble()) * 1000).toInt()
        }
        return answer
    }
}

 

오늘은 첫 문제부터 배웠던 내용이 나왔다. 계산기를 만들때 소수점까지 표현하기 위해 .toDouble() 을 자주 썼었는데 문제의 조건에 소수를 포함하여 계산하되 결과는 정수로 나오게 하라는 부분이 포함되어 있어서 바로 떠올릴 수 있었다.

 

위와 같은 형식은 형변환이라고 하며 값을 다른 타입으로 변환해 주는 것이다.

현재까지 써 본 형변환은 toInt() / toString() / toDouble() 뿐이지만 이 밖에도 다양한 형태가 있는 것 같다.

 

값을 변환하는건 쉽게 떠올렸으나 계산식의 어디에 적용해야 할지를 몰라서 시간이 조금 걸렸다. 다른사람들의 풀이를 보니 한쪽에만 형변환을 해서 소수로 만들고 곱한 뒤 다시 Int로 바꾸는 방식도 가능하다는걸 알았다. 아예 solution쪽에서 바로 작성해서 한줄로 끝나는 코드도 많았다. 나는 숫자 크기제한을 위해 식이 어쩔수없이 길어질수밖에 없었지만 그 방식도 깔끔하고 좋아보였다.

 

각도기

class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0

        if (0 < angle && angle < 90) {
           return 1
        } else if (angle == 90) {
            return 2
        } else if (90 < angle && angle < 180) {
            return 3
        } else {
            return 4
        }
    } 
}

 

원래는 when 식으로 써보려고 했으나 방식 변경을 위해 solution을 적절하게 바꾸질 못해 자꾸 오류가 났다.

게다가 in a .. b 식을 써보려고 했는데 이것 역시 오류가 났다.

나중에 다른사람 해답을 보니 ()로 닫아줘야 했었던걸 내가 몰라서였다. 

 

if문을 적게 써봐야겠다고 썼는데 사용하기가 쉬워서 자꾸 쓰게 된다. 원래는 제한사항을 습관적으로 써 두고 시작했는데, 이번 문제는 애초에 범위 구분 자체가 제한사항을 넘을 일이 없는 식인 것 같아서 생략해보았다. 

 

 

2. Kotlin 문법 심화 과제 - 호텔 예약 프로그래밍 

계산기 4단계를 해야한다는건 알았지만 너무 막막해서 기분전환 겸, 호텔 예약 프로그래밍을 시도해보았다.

아래는 레벨 1까지 완성한 코드다. 조금 긴데 그래도 많이 정리했다.

@RequiresApi(Build.VERSION_CODES.O)
fun main() {
    println("호텔예약 프로그램 입니다.")
    println("[메뉴]")
    println("1. 방예약, 2. 예약목록 출력, 3. 예약목록(정렬) 출력, 4. 시스템 종료, 5. 금액 입금-출금 내역 목록 출력, 6. 예약 변경/취소")
    var info = readLine()!!.toInt()

    var hotelmain = HotelMain()
    hotelmain.hotelMenu(info)
}

class HotelMain {

    @RequiresApi(Build.VERSION_CODES.O)
    fun hotelMenu(info: Int) : Any {
        return if (info == 1) {
            println("${info}번을 선택하셨습니다")
            println("호텔 예약을 시작합니다.")
            println("예약하실 방 번호를 입력해주세요.")
            var roomNum = readLine()!!.toInt()
            if (100 < roomNum && roomNum <= 999) {
                println("선택하신 방 번호는 ${roomNum} 입니다.")

                var now1 = LocalDate.now()
                var strNow1 = now1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

                println("오늘 날짜는 ${strNow1} 입니다. 예약하실 날짜를 입력해주세요.(yyyy-MM-dd)")
                var reserDate = readLine()!!.toString()
                var dateNow1 = LocalDate.parse(reserDate, DateTimeFormatter.ISO_DATE)


                if ((strNow1 > dateNow1.toString())) {
                    println("예약이 불가능합니다.")
                    println("오늘 ${strNow1} 보다 이후 날짜를 입력해주세요.")
                    return println("프로그램을 다시 시작해 주세요.")
                } else if ((strNow1 <= dateNow1.toString())) {
                    println("예약이 완료되었습니다.")
                    println("예약날짜는 ${reserDate} 입니다.")
                } else {
                    return println("다시 예약해 주세요.")
                }

                println("예약 날짜는 ${reserDate} 입니다. 체크아웃 날짜를 입력해주세요.(yyyy-MM-dd)")
                var checkOut = readLine()!!.toString()
                var dateNow2 = LocalDate.parse(checkOut, DateTimeFormatter.ISO_DATE)

                if ((dateNow1.toString() >= dateNow2.toString())) {
                    println("체크아웃이 불가능합니다.")
                    println("예약일 : ${checkOut} 보다 이후 날짜를 입력해주세요.")
                    return println("프로그램을 다시 시작해 주세요..")
                } else if ((dateNow2.toString() > dateNow1.toString())) {
                    println("체크아웃이 완료되었습니다.")
                    println("체크아웃 날짜는 ${checkOut} 입니다.")

                    // 호텔결제
                    var guestMoney = 100000
                    var roomCharge = 80000
                    var pee: Int = guestMoney - roomCharge

                    println("호텔 예약이 완료되었습니다. 요금이 결제되었습니다.")
                    println("잔액은 ${pee}입니다.")

                } else {
                    return println("다시 예약해 주세요.")
                }

            // 여기는 방 번호 선택
            } else {
                println("해당 호수는 존재하지 않습니다.")
                return roomNum
            }
        // 여기서부터 다시 메뉴선택
        } else if (info == 2){
            println("${info}번을 선택하셨습니다")
            0
        } else if (info == 3){
            println("${info}번을 선택하셨습니다")
            0
        } else if (info == 4){
            println("${info}번을 선택하셨습니다")
            println("프로그램을 종료합니다.")
            return info
        } else if (info == 5){
            println("${info}번을 선택하셨습니다")
            0
        } else if (info == 6){
            println("${info}번을 선택하셨습니다")
            0
        } else {
            0
        }
    }
}

 

 

앞부분은 이미 계산기를 만들때 해보기도 했고, 실수만 하지 않는다면 크게 어려운 부분은 없었으나 날짜 지정예약이 문제였다. 처음에는 날짜를 숫자로 받아서 범위를 지정할까 싶었는데 그러기엔 8자리 숫자는 너무 큰 수였다. 또 오늘을 기준으로 예약일을 정하기 때문에 지정해둔 날짜가 지나거나 체크아웃 역시 같이 영향을 받는게 문제였다.

혹시 날짜를 자동으로 만들어주는게 없을까 싶어 찾아보다가 좋은 내용을 발견해 바로 적용했다.

심지어 날짜를 받아서 yyyy-MM-dd 형태로 보여주거나 String으로 바꿔주는것도 가능했다.

 

우선 오늘날짜를 받아와 기준점을 정한다. 그리고 날짜형식을 지켜 입력받은 값을 LocalDate 로 변환해서 조건을 지정하고 비교 후 순서대로 if 를 통해 출력했다. 마지막에 출력되는 값은 입력받은 값이든 LocalDate로 변환된 값이든 상관없을것 같아 알아보기 쉽게 지정해둔 입력값으로 보여주었다.

 

결제는 임의값을 지정하고 출금되게끔 하라고만 되어있었는데 잔액을 표시해주면 좋을 것 같아 추가하였다.

 

개선점

1. 클래스 나누기

피드백을 받기전에 먼저 처음부터 클래스를 나눠놓고 시작할까 고민했지만, 아직 실력이 충분하지 않아 나누다가 뭔가 잘못될것같아서 일단 레벨 1은 한 파일에 전부 만들어보기로 했다. 다른 수정사항을 전부 고친 뒤에 나눠볼 생각이다.

 

2. try - catch 이용하여 예외처리 하기

아직 4강을 듣지 않아 몰랐던 사실인데 if 등을 이용해서 처리할때 예외에 해당되는 입력을 받으면 그대로 종료되거나 오류가 나는 경우가 많았다. 그럴때는 try-catch 를 이용해서 처리해주면 예외를 전부 하나하나 지정해서 처리하지 않아도 한번에 처리가 가능하다고 한다. 아예 예약 프로그램 전체를 묶어서 한번만 만들어줘도 전부 처리되게도 할수있다고 하셨는데 한번 해 볼 생각이다.

 

3. 변수 이름 직관적으로 정리하기

나름대로 정리를 한다고 하긴 했는데, 만든 사람인 내가 보는게 아니라 전혀 다른 사람이 보면 확실히 알아보기 어려워 보였다. 추가설명 없이도 바로 알아볼 수 있게 조금 더 길어지더라도 다시 지정해서 정리하는게 나을 것 같다.

 

4. 다음 레벨에서 예약자 명단을 어떤식으로 저장할지 고민해보기 

값을 먼저 지정해두고 그걸 뽑아쓰는 것 위주로 배웠지 직접 지정한 값을 저장하는건 딱히 생각해보지 않았다. 당장 프로그램을 실행시키는 도중에야 임시로 저장할수 있더라도 껐다가 다시 켜서 불러와도 바로 예약자 명단이 뜨게 하려면 어떻게 해야할지 고민이 된다. 이전에는 데이터베이스에 저장을 했는데 거기까진 말고 다른 파일이나 문서형태로 저장했다가 불러와서 리스트 형태로 출력해줄수는 없을까 고민된다.