티스토리 뷰

코드카타

 

N개의 최소공배수

 

문제

 

주어진 배열의 모든 요소에 대한 최소공배수를 계산하는 문제

 

 

풀이

class Solution {
    fun solution(arr: IntArray): Int {

        fun gcd(a: Int, b: Int): Int {
            val r = a % b
            if (r == 0) return b
            else return gcd(b, r)
        }

        fun lcd(a: Int, b: Int): Int {
            return a * b / gcd(a, b)
        }

        var res = arr[0]
        for (i in arr) {
            res = lcd(res, i)
        }

        return res
    }
}

모든 배열 요소를 순회하며 최소공배수를 구하고, 저장하는 방식으로 코드를 짰다.

(최소공배수, 최소공약수 함수 설명은 사전캠프 TIL 8일차 때 했으니까 생략)

 


 

키오스크 구현하기

 

Lv 1

 

구현 사항

- 프로그램을 실행하면 메뉴판의 번호들을 보여준다. (대분류의 메뉴를 보여줌)

- 대분류 메뉴에 해당하는 숫자를 입력하면 선택하면 세부 메뉴들을 보여준다.

- 반복문을 이용해서 메뉴 선택할 수 있게 유지하고, 
  대분류 메뉴에서 0번이 입력되면 프로그램을 종료합니다.

 

 

메뉴 출력 함수

fun showMainMenu() {
    println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.")
    println()
    println("[ 주영버거 메뉴 ]")
    println("1. 햄버거")
    println("2. 감자튀김")
    println("3. 음료수")
    println("0. 프로그램 종료")
    println()
    print("메뉴를 선택하세요: ")
}

fun showHamburgerMenu() {
    println("[ 햄버거 메뉴 ]")
    println("1. 불고기 버거")
    println("2. 치즈 버거")
    println("3. 새우 버거")
    println("0. 뒤로가기")
}

fun showPotatoMenu() {
    println("[ 감자튀김 메뉴 ]")
    println("1. 기본 감자튀김")
    println("2. 양념 감자튀김")
    println("3. 허니 감자튀김")
    println("0. 뒤로가기")
}

fun showDrinkMenu() {
    println("[ 음료 메뉴 ]")
    println("1. 사이다")
    println("2. 콜라")
    println("3. 환타")
    println("0. 뒤로가기")
}

메뉴 출력 함수를 정의함으로써 main함수 내의 코드의 가독성을 향상시킨다.

 

 

 

구현

fun main() {
    while (true){
        showMainMenu()
        val menuNum = readln().toInt()
        if (menuNum == 0) {
            print("\n프로그램을 종료합니다.")
            break
        }

        println()

        while (true){
            var menu = ""
            when (menuNum) {
                1 -> {
                    menu = "햄버거"
                    showHamburgerMenu()
                }
                2 -> {
                    menu = "감자튀김"
                    showPotatoMenu()
                }
                3 -> {
                    menu = "음료"
                    showDrinkMenu()
                }
            }
            println()
            print("${menu} 선택: ")
            var menuNum2 = readln().toInt()
            if(menuNum2 == 0){
                println()
                break
            }
            println()
        }
    }
}

while문을 사용하여 반복적으로 메뉴를 선택할 수 있도록 했고,

0을 입력하면 반복문을 break하여 앱이 종료되도록 하였다.

 

입력한 메뉴 번호에 따라 보여지는 세부 메뉴 처리는 when을 통해서 진행하였다

 

 

실행 결과

 

 

 

Lv 2

 

구현 사항

- 각 메뉴 클래스들을 설계한다

- 클래스들의 프로퍼티와 메소드를 정의한다.

- Lv1에서 작성한 로직을 메소드로 만든다.

 

 

음식 클래스 작성

class Hamburger(val name: String, val price: Int) {
    fun displayInfo(): String{
        return "${name} - ${price}원"
    }
}

class Potato(val name: String, val price: Int) {
    fun displayInfo(): String{
        return "${name} - ${price}원"
    }
}

class Drink(val name: String, val price: Int) {
    fun displayInfo(): String{
        return "${name} - ${price}원"
    }
}

각각의 메뉴(햄버거, 감자튀김, 음료) 클래스를 작성한다.

 

해당 클래스들은 이름과 가격을 프로퍼티로 가지며 

상품의 정보를 반환하는 displayInfo()라는 메소드를 가지고 있다.

 

 

작성한 클래스의 활용

fun showHamburgerMenu() {
    val burger1 = Hamburger("불고기 버거", 2800)
    val burger2 = Hamburger("치즈 버거", 3200)
    val burger3 = Hamburger("치킨 버거", 3600)

    println("[ 햄버거 메뉴 ]")
    println("1. ${burger1.displayInfo()}")
    println("2. ${burger2.displayInfo()}")
    println("3. ${burger3.displayInfo()}")
    println("0. 뒤로가기")
}

fun showPotatoMenu() {
    val potato1 = Potato("기본 감자튀김", 1200)
    val potato2 = Potato("양념 감자튀김", 1500)
    val potato3 = Potato("허니 감자튀김", 1800)

    println("[ 감자튀김 메뉴 ]")
    println("1. ${potato1.displayInfo()}")
    println("2. ${potato2.displayInfo()}")
    println("3. ${potato3.displayInfo()}")
    println("0. 뒤로가기")
}

fun showDrinkMenu() {
    val drink1 = Drink("사이다", 1000)
    val drink2 = Drink("콜라", 1000)
    val drink3 = Drink("환타", 1000)

    println("[ 음료 메뉴 ]")
    println("1. ${drink1.displayInfo()}")
    println("2. ${drink2.displayInfo()}")
    println("3. ${drink3.displayInfo()}")
    println("0. 뒤로가기")
}

위 함수들은 각각의 메뉴 항목을 보여주는 역할을 한다.

각 함수는 해당 클래스의 객체들을 생성하여 출력한다.

 

 

로직 메소드화

fun chooseFood(menuNum: Int) {
    var menu = ""
    when (menuNum) {
        1 -> {
            menu = "햄버거"
            showHamburgerMenu()
        }
        2 -> {
            menu = "감자튀김"
            showPotatoMenu()
        }
        3 -> {
            menu = "음료"
            showDrinkMenu()
        }
    }
    println()
    print("${menu} 선택: ")
}

입력한 메뉴 번호에 따라 음식 메뉴를 출력하는 로직을 메소드화 하였다.

해당 메소드는 menuNum(입력한 메뉴 번호)을 인자값으로 받는다.

 

 

코드 간결화

fun main() {
    while (true){
        showMainMenu()
        val menuNum = readln().toInt()
        if (menuNum == 0) {
            print("\n프로그램을 종료합니다.")
            break
        }

        println()

        while (true){
            chooseFood(menuNum)
            val foodNum = readln().toInt()
            if(foodNum == 0) {
                println()
                break
            }
            println()
        }
    }
}

main함수의 코드가 한 층 간결화 되었다.

 

 

 

Lv 3

 

구현 사항

- Lv2에서 설계한 클래스들을 상속 관계를 가지도록 변경한다.

- 프로그램을 실행하면 메뉴들을 객체화하고 리스트에 담아둡니다.

- 하나의 리스트 객체로 모든 메뉴들을 관리하도록 수정합니다.

 

 

클래스 상속관계 정의

open class Food(val name: String, val price: Int) {
    fun displayInfo(): String {
        return "$name - ${price}원"
    }
}

class Hamburger(name: String, price: Int) : Food(name, price)
class Potato(name: String, price: Int) : Food(name, price)
class Drink(name: String, price: Int) : Food(name, price)

세 메뉴 클래스는 같은 구조를 갖고 있기에 이를 더 추상화하고 중복을 줄일 수 있다.

Food 클래스를 만들어 공통된 속성과 메소드를 부모 클래스로 추상화 한다.

 

자식 클래스인 세 메뉴 클래스는 부모 클래스인 Food 클래스를 상속하여

모든 메뉴 클래스에서 displayInfo() 메소드를 호출할 수 있다.

 

 

메뉴 객체화

class MenuItem(val name: String, val items: List<Food>)

object Menu {
    val menuItems: List<MenuItem>

    init {
        val hamburgers = listOf(
            Hamburger("불고기 버거", 2800),
            Hamburger("치즈 버거", 3200),
            Hamburger("치킨 버거", 3600)
        )

        val potatoes = listOf(
            Potato("기본 감자튀김", 1200),
            Potato("양념 감자튀김", 1500),
            Potato("허니 감자튀김", 1800)
        )

        val drinks = listOf(
            Drink("사이다", 1000),
            Drink("콜라", 1000),
            Drink("환타", 1000)
        )

        menuItems = listOf(
            MenuItem("햄버거", hamburgers),
            MenuItem("감자튀김", potatoes),
            MenuItem("음료", drinks)
        )
    }
}

이름과 음식 메뉴 리스트 프로퍼티를 가지는 MenuItem이란 클래스를 만든다.

Menu 오브젝트의 init에서 menuItems를 MenuItem을 요소로 가지는 리스트로 초기화 한다.

 

 

Menu.menuItems = [MenuItem(name = 햄버거, items = [ 햄버거 객체들 ]), 
                  MenuItem(name = 감자튀김, items = [ 감자튀김 객체들 ]), 
                  MenuItem(name = 음료, items = [ 음료 객체들 ])

menuItems리스트는 이런 형태의 값을 가진다.

 

 

메뉴 출력하기

fun showMainMenu() {
    println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.")
    println()
    println("[ 주영버거 메뉴 ]")
    Menu.menuItems.forEachIndexed{i, menu -> println("${i + 1}. ${menu.name}")}
    println("0. 프로그램 종료")
    println()
    print("메뉴를 선택하세요: ")
}

fun chooseFood(menuNum: Int) {
    val foodMenu = Menu.menuItems[menuNum - 1]
    println("[ ${foodMenu.name} 메뉴 ]")
    foodMenu.items.forEachIndexed { index, item ->
        println("${index + 1}. ${item.displayInfo()}")
    }
    println("0. 뒤로가기")
    println()
    print("${foodMenu.name} 선택: ")
}

forEachIndexed로 메뉴와 세부메뉴를 양식에 맞게 출력한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함