티스토리 뷰

코드카타

 

멀리 뛰기

 

문제

 

 n개의 칸이 주어졌을 때 끝에 도달할 수 있는 경우의 수 구하기

 

 

점화식 찾기

n = 0 | 0
n = 1 | (1) -> 1
n = 2 | (1, 1) (2) -> 2
n = 3 | (1, 1, 1), (1, 2), (2, 1) -> 3
n = 4 | (1, 1, 1, 1), (1, 1, 2), (1, 2, 1), (2, 1, 1), (2, 2) -> 5

n >= 3 일 때, 점화식은  f(n) = f(n 1) + f(n 2)에 해당한다.

해당 점화식은 피보나치 수열에 해당한다.

 

 

풀이

class Solution {
    fun solution(n: Int): Int {
        // n이 0 ~ 2일 때의 초기 반환값 설정
        var arr = mutableListOf(0, 1, 2)
        
        // n이 3이상일 때 피보나치 수열을 리스트에 더한다. 
        (3..n).forEach { arr.add((arr[it - 1] + arr[it - 2]) % 1234567) }
        
        return arr[n]
    }
}

메모이제이션 방식으로 피보나치 수열을 만들고 

해당 피보나치 수열의 n번째 값을 반환한다.

 

n이 3미만의 값이면 해당 for문을 실행시키지 않는다.

 


 

키오스크 구현하기

 

Lv 4

 

구현 사항

- 메뉴판 번호는 숫자기에 숫자를 입력해야 하는데 문자를 입력했을 때,
  메뉴판에 없는 숫자를 입력했을 때, 다시 입력할 수 있도록 예외처리를 진행한다.
  
- 현재 잔액과 가격을 비교해서 구매 가능한 상태를 클래스에 추가적으로 구현한다.

 

 

유저 클래스 구현

class User(var money: Int) {
    fun purchase(food: Food) {
        if (money >= food.price) {
            money -= food.price
            println("${food.name} 구매, 잔액: ${money}원")
        } else {
            println("잔액 부족, 현재 잔액: ${money}원")
        }
    }
}

잔액을 프로퍼티로 갖는 유저 클래스를 구현한다.

 

purchase 메소드는 구매한 음식(Food 클래스)를 인자로 받아

유저의 잔액에 따라 다른 메시지를 출력한다.

 

 

예외처리 진행

fun main() {
    val user = User(10000)

    while (true) {
        showMainMenu()
        try {
            val menuNum = readln().toInt()
            if (menuNum == 0){
                print("\n프로그램을 종료합니다.")
                break
            }
            println()
            while (true) {
                val foodMenu = Menu.menuItems[menuNum - 1]
                chooseFood(foodMenu)
                try {
                    val foodNum = readln().toInt()
                    if (foodNum == 0) {
                        println()
                        break
                    }
                    val food = foodMenu.items[foodNum-1]
                    user.purchase(food)
                    println()
                }catch (e:ArrayIndexOutOfBoundsException){
                    printErrorMessage1()
                } catch (e: NumberFormatException){
                    printErrorMessage2()
                }
            }
        } catch (e:ArrayIndexOutOfBoundsException){
            printErrorMessage1()
        } catch (e: NumberFormatException){
            printErrorMessage2()
        }
    }
}

메뉴를 선택하기 위해 번호를 입력할 때마다 두 개의 예외처리를 진행한다.

 

메뉴에 없는 번호를 입력했을 때(리스트에 없는 번지 수를 탐색하려 할 때)와

문자를 입력했을 때(숫자 말고 다른 것을 입력했을 때)의 예외처리를 진행했다.

 

 

실행 결과

 

기존 로직에서 주문한 음식을 계산하는 로직이 추가되었다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함