티스토리 뷰
코드카타
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로 메뉴와 세부메뉴를 양식에 맞게 출력한다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 20일차 (귤 고르기 - Kotlin) (0) | 2024.06.15 |
---|---|
TIL 19일차 (멀리 뛰기 - Kotlin | 키오스크 Lv4 구현) (0) | 2024.06.14 |
TIL 17일차 (예상 대진표 - Kotlin | 코틀린 심화문법 정리 2) (0) | 2024.06.12 |
TIL 16일차 (카펫 - Kotlin | 코틀린 심화 문법 정리 1) (0) | 2024.06.11 |
TIL 15일차 (피보나치 수 - Kotlin | 계산기 구현 과제 피드백 반영) (0) | 2024.06.10 |