코틀린/코딩테스트

베이직챌린지

정혜현 2024. 7. 8. 21:39

Q.1 [에디쌤] 1~100의 숫자중 2의 배수이면서 3의배수(and조건)인 숫자 출력해주세요

A.1

fun main() {
val answer = (1..100).filter{ it % 2 == 0 && it % 3 == 0}
    println(answer)
}

 

 

Q.2 [에디쌤] 1~100까지 정수 중 홀수의 합을 출력해 주세요. [입력: X, 출력: 2500]

A.2

fun main() {
val answer = (1..100).filter{ it % 2 == 1}.sum()
    println(answer)
}

 

 

Q.3 [에디쌤] 단어 뒤집기(입력: "Hello World", 출력: "olleH dlroW") 띄어쓰기 필수, 단어별로 뒤집기

A.3

fun main() {
		val helloWorld = StringBuilder("Hello World").reverse()
    val worldHello = helloWorld.drop(6).toString() + helloWorld.slice(5..5).toString() + helloWorld.take(5).toString()
    println(worldHello)
}

 

반복문 조건문 버전

fun main() {
		val helloWorld = StringBuilder("Hello World").reverse()
    val worldHello = mutableListOf<String>("","","")
    helloWorld.forEachIndexed {i, it ->
        when(i){
            in 0..4 -> worldHello[2] += it.toString()
            5 -> worldHello[1] += it.toString()
            in 6..11 -> worldHello[0] += it.toString()
        }
    }
    println(worldHello[0] + worldHello[1] + worldHello[2])
}

 

 

Q.4 [에디쌤] 1에서 9까지 한 자리 자연수 입력 시 그 수만큼 반복된 문자열 출력 (입력: 3 -> 출력: 333)

A.4

fun main() {
val int = 3
    var answer = ""
    while(true) {if(answer.length == int) break
        answer += int
    }
    println(answer)
}

 

 

Q.5 [에디쌤] 3과목 점수를 입력받아 평균 점수를 출력하고, 평균 점수가 70점 이상이면 합격입니다를, 아니면 불합격입니다를 출력해주세요.

A.5 

 

 

Q.6 [에디쌤] 1에서 10까지 숫자 중에서 약수를 출력 (입력 : 9, 출력 : 1,3,9) 입력 :10, 출력 : 1,2,5,10)

A.6

fun main() {
    val answer = (1..10).filter { 10 % it == 0 }
    println(answer)
}

 

 

Q.7 [에디쌤] 시작 수와 끝 수를 입력 받아 그 사이에 있는 5의 배수를 출력하시오 (입력 : 3, 38 / 출력 : 5, 10, 15, 20, 25, 30, 35)

A.7

fun main() {
val start = readlnOrNull()?.toInt()?: 0
val end = readlnOrNull()?.toInt()?: 0
    val answer = (start..end).filter{ it % 5 == 0 }
    println(answer)
}

 

 

Q.8 [에디쌤] 1에서 100까지 숫자 중에서 5의 배수만 더한 값을 출력 (입력 : 없음, 출력 : 1050)

A.8

fun main() {
	var answer = 0
	(1..100).filter{it % 5 == 0}.forEach{answer += it}
	print(answer)
}

 

 

Q.9 반복문을 사용하여 아래와 같이 별을 출력하는 프로그램을 작성해보세요.

A.9

fun main(){
	var answer = ""
  repeat(5) {
	  answer += "*"
		println(answer)
  }
}

forEach로 풀었는데 안드로이드 스튜디오에서 repeat을 추천해 새로 알게됐다.

 

 

Q.10 사용자로부터 입력 받은 숫자에 대한 구구단을 출력하는 프로그램을 작성해보세요

A.10

fun main() {
	val userInput = readlnOrNull()?.toInt()?: 0
  (1..9).forEach{
	  println(it * userInput)
  }
}

 

 

Q.11 로또번호 생성기, 1~45중 6개의 숫자 랜덤, 중복 숫자는 건너뛰기.

A.11

 

 

Q.12 Y광산에서는 2개의 채굴기를 사용하고 있으며, 하루에 1개의 채굴기만을 사용하고, 채굴기의 과부하를 막기 위하여 2일 작업 후 다른 채굴기로 교체하여 작업을 합니다. 채굴기 A는 하루 20kg을, 채굴기 B는 하루 17kg의 광물을 채굴할 수 있습니다. 현재 Y광산의 남은 광물의 양이 450kg, 채굴기 A가 최초 투입되는 순번이라고 가정할 때, Y광산의 마지막 광물이 채굴되는 날에 돌아가고 있는 채굴기 종류(A/B)와 해당 채굴기가 당일 채굴한 광물의 양(~kg)을 구해주세요.

A.12

fun main() {
		val miningMachine = arrayOf(20, 17)
    var mineral = 450
    var day = 1
    while (true) {
        if (mineral <= 17) {
            println("${mineral}kg의 광물 잔여량을 채굴하고 마칩니다")
            break
        }
        miningMachine.forEachIndexed { index, i ->
            when (index) {
                0 -> {
                    repeat(2) {
                        mineral -= i
                        day++
                        println("채굴기 : A 광물 잔여량 : ${mineral}")
                        println("---------------------------${day}번째 날")
                    }
                    println("> 채굴기를 B로 교체합니다")
                }

                1 -> {
                    repeat(2) {
                        mineral -= i
                        day++
                        println("채굴기 : B 광물 잔여량 : ${mineral}")
                        println("---------------------------${day}번째 날")
                    }
                    println("> 채굴기를 A로 교체합니다")
                }
            }
        }
    }
}

 

 

Q.13 A는 사표를 내고 받은 퇴직금을 쓰면서 쉬려고 합니다. A가 돈이 떨어져서 다시 일하러 나가야 하는 날짜가 "n년-m월-d일"이라고 할 때, 아래의 조건을 만족하는 "n, m, d"의 값을 출력하세요. 조건 1) A는 출근과 동시에 월급을 받을 수 있으며, 주간 근무를 하게됩니다. 조건 2) A가 퇴직한 날은 20년 5월 13일이며, 퇴직금으로 받은 돈은 1500만원입니다. 조건 3) 매월 통신비(10만원, 10일), 월세(35만원, 15일), 보험비(15만원, 20일), 아파트 관리비(15만원, 20일), 카드비(75만원, 25일)가 지출됩니다. 조건 4) 오직 퇴직금만을 활용하여 생활비를 충당해야하며, 추가 수입원은 없습니다. 조건 5) 상기 명시된 지출금액 이외에 추가 지출은 발생하지 않으며, 지출금액은 오후에 결제가 됩니다.

A.13

fun main() {
    val withdraw = mapOf(
        "10일 통신비" to 100_000,
        "15일 월세" to 350_000,
        "20일 보험비, 아파트 관리비" to 300_000,
        "25일 카드비" to 750_000
    )
    var account = 15_000_000
    var year = 2024
    var month = 5
    var withdrew = true //이미 납부한 5월 10일 통신비 제외

    while (true) {
        for (k in withdraw.keys) {
            if (account < withdraw.getValue(k)) {
                println("${k}내려면 돈 벌어 오세요!")
                break
            } else if (withdrew) {
                withdrew = false
                continue
            } else {
                account -= withdraw.getValue(k)
                println("${k} 출금")
                println("> 통장 잔액 : ${account}원")
            }
        }
        if (account < 100_000) break
        month++
        if (month > 12) {
            year = 2025
            println("----------------------${year}년 ${month - 12}월")
        } else println("----------------------${year}년 ${month}월")
    }
}

 

처음에 이렇게 풀었는데 n년 m월 d일로 출력해야 돼서 되게 고민 많이했다..... k가 d에 들어가면 좋은데 d에 담으려고 하면 빨간 줄이 쳐져서 처음엔 키값을 담으려면 같은 지역에서 선언해야 되는 줄 알고 위치를 여기저기 옮겨봤는데도 안됐다. 알고보니 main에서 사용된 적 없어서 빨간 줄이 뜬거였고 d변수를 main에서 println에 호출하니 담겼다. 

아래 14번 문제에서도 그렇고 이번에도 원인을 혼자 추측해서 삽질하는 경향이 있다. 문제가 발생하면 검색해봐야겠다.

fun main() {
		val withdraw = mapOf(
        "10일" to 100_000, // 통신비
        "15일" to 350_000, // 월세
        "20일" to 300_000, // 보험비, 아파트 관리비
        "25일" to 750_000  //카드비
    )
    var account = 15_000_000 //퇴직금
    var n = 2020
    var m = 5
    var d = ""
    var withdrew = true //이미 납부한 5월 10일 통신비 제외

    while (true) {
        for (k in withdraw.keys) {
            if (account < withdraw.getValue(k)) {
                println("돈 벌어 오세요!")
                break
            } else if (withdrew) {
                withdrew = false
                continue
            } else {
                account -= withdraw.getValue(k)
                d = k
                println("${k} 출금")
                println("> 통장 잔액 : ${account}원")
            }
        }
        if (account < 100_000) break
        m++
        if (m > 12) {
            m -= 12
            n = 2021
            println("----------------------${n}년 ${m}월")
        } else println("----------------------${n}년 ${m}월")
    }
    print("${n}년 ${m}월 ${d}")
}

 

 

Q.14 사용자로부터 하나의 정수를 입력받고 해당 숫자의 모든 약수를 배열 형태로 나타내시오

A.14

fun main() {
	val userInput = readlnOrNull()?.toInt()?: 0
  var answer = arrayOf<Int>()
  (1..userInput).forEach {
	  if(userInput % it == 0) answer += it
    }
  println(answer.contentToString())
}

 

배열을 출력하면 주소값이 나온다. .contentToString()로 출력해야 문자열로 나타난다. 

 

 

Q.15 사용자로부터 숫자를 입력받고 해당 숫자가 3의 배수인지 5의 배수인지 둘 다 아닌지 판별하는 코드를 작성하시오(0 입력 시 다른 숫자를 입력하라는 문구가 나오도록 출력하고 3의 배수와 5의 배수 모두 해당하는 경우 3의 배수이면서 5의 배수라는 문구가 나오도록 출력) Ex) 입력 : 15 -> 출력 : 3의 배수이면서 5의 배수입니다.

A.15

fun main() {
	val userInput =  readlnOrNull()?.toIntOrNull()?: 0
  when {
	  userInput == 0 -> println("다른 숫자를 입력해주세요")
	  userInput % 3 == 0 && userInput % 5 != 0-> println("3의 배수입니다")
	  userInput % 5 == 0 && userInput % 3 != 0-> println("5의 배수입니다")
	  userInput % 3 == 0 && userInput % 5 == 0 -> println("3의 배수이면서 5의 배수입니다")
	}
}

 


Q.16 사용자로부터 숫자를 입력받고 해당 숫자를 1부터 9까지 곱한 결과들의 합을 출력하시오. (예시 : 입력 > 3 , 출력 > 135)

A.16

fun main() {
	val userInput =  readlnOrNull()?.toIntOrNull()?: 0
  var answer = 0
  (1..9).forEach{ answer += it * userInput }
  println(answer)
}

 


Q.17 사용자로부터 문자열을 입력받고 해당 문자열에 문자 'p'가 몇 개 있는지 세어주는 코드를 작성하시오

A.17

 


Q.18 사용자로부터 두 숫자를 입력받아 첫 번째 숫자와 두 번째 숫자 사이의 모든 숫자 합을 구하시오.(예시 : 12, 15 → 12 + 13 + 14 + 15 = 54)

A.18

fun main() {
	val userNumber1 = readln().toIntOrNull() ?: 0
	val userNumber2 = readln().toIntOrNull() ?: 0
	val answer = (userNumber1..userNumber2).sum()
	println(answer)
}

 

readln() readLine()

공통점 : .toInt()로 Null입력시 NumberFormatException발생. toIntOrNull로 방지할 수 있다.

readln() : non Null, 간결함 결론은 readln().toIntOrNull() 조합이 제일 낫다

readLine() : Nullable, readlnOrNull도 이와 동일하다.

 


Q.19 안녕! 나는 낄몬이라고 해! 길이가 n이고 "낄몬낄몬낄... 와 같은 패턴을 유지하는 문자열을 리턴해보세요! 길이는 원하는 만큼 임의로 설정해서 출력해보세요! e.g) n이 5면 "낄몬낄몬낄"을 리턴하고 6이면 "낄몬낄몬낄몬"을 리턴하시오.

A.19

 

 

Q.20 업다운 게임! 1부터 100 사이의 숫자 중 골라 정답을 맞춰보세요! 조건 1) Random.nextInt(1, 101)를 사용하여 1부터 100 사이의 임의의 숫자 선택 조건 2) 입력한 숫자가 정답보다 작은 경우, 큰 경우, 정답인 경우를 출력하게 하고 정답이면 게임 종료

A.20

fun main() {
	val targetNumber = Random.nextInt(1,101)
  while(true) {
	  val userNumber = readln().toIntOrNull() ?: 0
    when {
	    userNumber > targetNumber -> println("${userNumber}보다 작습니다.")
	    userNumber < targetNumber -> println("${userNumber}보다 큽니다.")
	    else -> {
	        println("정답입니다.")
	        break
      }
    }
  }
}

 


Q.21 베스킨라빈스 31! 시작 숫자 0, 마지막 숫자 31로 설정하고 반복문을 돌리고 그 안에서 유저와 컴퓨터가 싸워 대결에서 승리해보세요! 조건 1) null 값이나 3을 초과하면 다시 선택해달라는 문구를 출력하시오. 조건 2) Random.nextInt(1, 4)를 이용하여 컴퓨터가 부를 수 있는 수의 갯수 제한을 3개로 두시오.

A.21

 

 

Q.22 369 369! 끝내고 싶은 숫자를 입력하고 조건문과 반복문을 사용하여 숫자 3,6,9가 들어간 수가 출력될 때마다 "짝"을 출력하게 해보세요!! 10 → 1,2,3짝, 4, 5, 6짝

A.22

fun main() {
	var answer = arrayOf<String>()
	val endNumber = readln().toIntOrNull() ?: 0
	(1..endNumber).forEach{answer += if(it % 3 == 0) it.toString() + "짝" else it.toString()}
	println(answer.contentToString())
}

 

 

Q.23 다양한 트랩을 피해 골인해보거라! 1부터 6까지의 주사위를 굴려 3의 배수가 나오면 시작 지점으로 돌아가고 5가 나오면 10칸 전진, 2가 나오면 두 칸 후진하고 그렇지 않은 경우엔 한 칸 전진하여 골인 지점에 도착해보거라! 조건) random()을 사용하여 주사위를 무작위로 굴릴 수 있게 하시오. 꼭 주사위 굴릴 때마다 멈출 필요 없음 시작부터 골인까지 과정만 쫙 출력돼도 됨. 골인칸 > 예 100, 현재 칸수

A.23

fun main() {
	println("도착지를 숫자로 입력하세요")
	val destination = readln().toIntOrNull() ?: 0 //도착지
	var location = 0 //현재위치
	while (true) {
    if(location >= destination) {
      println("${destination}에 도착했습니다") //도착하면 종료
      break
	  }
	  val random = (1..6).random()
	  println("주사위 : ${random}")
	  when(random) {
      2 -> location = if(location >= 0) 0 else -2 //시작점이 최소값
      3,6 -> {
          location = 0
          println("---------------시작점으로 돌아갑니다")
      }
      5 -> location += 10
      else -> location += 1
	  }
  println("현재 위치는 ${location}입니다")
}

시작점에서 음수로 빠지지 않도록 처리하고 도착지와 현재위치가 같거나 클 때 도착으로 설정해야한다.

 

 

Q.29 영어의 개수를 직접 세기 귀찮았던 조반씨는 영어를 입력하면 입력받은 영어 문자의 개수를 세어주는 코드를 짜기로 결심했습니다. 결심까지는 좋았지만 인생이 그렇듯 항상 제 마음대로 코드가 써지지 않습니다. 조반씨를 도와서 코드를 함께 해결해주세요! (입력은 영어, 숫자만 가능) 입력 33fw4dd2, 출력:4

A.29

fun main() {
	val letter = "33fw4dd2"
	val findEnglish = Regex("^[a-zA-Z]*$")
	var answer = ""
	letter.forEach { if(findEnglish.matches(it.toString())) answer += it }
	println(answer.length)
}

 

 

Q.30 이중씨와 조건씨는 오랜 친구입니다. 둘의 연인과 함께 더블데이트를 가자는 의견이 나와 날짜를 확인하는 중 머리가 아파와서 코딩에게 조금의 도움을 받기로 합니다. 다음 조건을 만족하면서 8월 중 더블데이트가 가능한 날짜들을 출력해주세요. 조건 1. 이중씨의 연인은 3의 배수인 날짜에만 시간이 비어요. 조건 2. 조건씨는 20일 이후로만 시간이 비어요.

A.31

fun main() {
	var possibleDay = arrayOf<Int>()
	possibleDay += (1..31).filter{ it % 3 == 0 && 20 < it }
	println(possibleDay.contentToString())
}

 


Q.31 나이를 입력하면 10대이하, 10대, 20대, 30대, 40대, 그이상으로 분류해 코멘트가 출력되도록 해주세요.

A.31

fun main() {
	val userInt = readln().toIntOrNull() ?: 0
	when{
	    userInt < 10 -> println("10대 이하")
	    userInt in 10..19 -> println("10대")
	    userInt in 20..29 -> println("20대")
	    userInt in 30..39 -> println("30대")
	    userInt in 40..49 -> println("40대")
	    else -> println("그 이상")
}
}

 


Q.32 1부터10사이의 홀수만 곱하는 코드를 만들어주세요 1*3*5*….. =

A.32

fun main() {
	var answer = 1
	for(i in 1..10 step(2)) {
    answer *= i
  }
  println(answer)
}

 


Q.33 "진상 손님이 방문하셨어요!!! 오늘 제가 만들어야되는 메뉴를 알려주세요!" 우리 진상손님은요 이 메뉴만 먹어요. (1) 진상손님은 일주일 내내 방문하는데 항상 "따뜻한 아이스 아메리카노"를 시키지만 토요일에는 "달지않은 연유딸기라떼", 일요일에는 "아이스핫초코"를 시켜요 (2) 요일을 입력하면 자동으로 메뉴가 출력되도록 해주세요.

A.33

fun main() {
	val today = readln()
	val dayList = listOf("월","화","수","목","금","토","알")
	when(today) {
	  dayList[5] -> println("달지않은 연유딸기라떼")
	  dayList[6] -> println("아이스핫초코")
	  !in dayList -> println("요일을 입력해주세요")
	  else -> println("따뜻한 아이스 아메리카노")
	}
}

 

 


Q.34

A.34

 


Q.35 주민번호 앞자리 6자리를 입력 하여 성인 여부를 판단하도록 해주세요,

A.35

fun main() {
    val today = listOf(24,7,10)
    println("주민번호 앞자리 입력 (예:090709)")
    val userInput = readln().chunked(2)
    when (userInput[0].toInt()) {
        in 0..4, in 25..99 -> println("성인")
        5 -> if(userInput[1].toInt() < today[1]) println("성인")
                else if(userInput[2].toInt() <= today[2]) println("성인")
                    else println("미성년자")
        else -> println("미성년자")
    }
}

 

조건 걸면 () 논리연산자 쓰려고 하지말고 콤마,로 이어주자

 


Q.36 3개의 정수를 입력받아 가장 작은 숫자를 찾아 출력하도록 해주세요

A.36

fun main() {
		val userNumber = arrayOf(readln().toIntOrNull() ?: 0, readln().toIntOrNull() ?: 0, readln().toIntOrNull() ?: 0)
    var answer = 0
    (0..2).forEach {
        if(userNumber[it] > answer) answer = userNumber[it]
    }
    println(answer)
}

 


Q.37 정수를 입력하면 그 정수에 *1~*9까지의 수가 모두 출력되게 해주세요

A.37

fun main() {
		val userNumber = readln().toIntOrNull() ?: 0
    (1..9).forEach {println(userNumber * it)}
}

 


Q.38 정수를 입력받아 그 수를 거꾸로 출력하게 해주세요

A.38

fun main() {
		val userNumber = readln().toIntOrNull() ?: 0
    val answer = StringBuilder()
    for(i in userNumber.toString()) {
        answer.insert(0, i)
    }
println(answer)
}

 


Q.39 입력받은 수가 짝수인지 홀수인지 확인후 짝수이면 제곱하여 출력하고 홀수라면 제곱하여 2로 나눈 값을 출력하게 해주세요

A.39

fun main() {
    val userNumber = readln().toIntOrNull() ?: 0
    if (userNumber % 2 == 0) println(userNumber * userNumber)
    else println(userNumber.toDouble() * userNumber.toDouble() / 2.toDouble())
}

 

 


 

많이 풀어보니 확실히 이해도가 올라가고, 여러 방향을 고민해보았으며, 다른 사람의 코드도 보면서 배울 수 있어 좋은 경험이었다.