코틀린(Kotlin)/TIL

[코틀린(Kotlin)] 기초문법 조건문/반복문 연습

초보왕보초 2023. 12. 18. 20:56
728x90

기초문법 중에서도 조건문과 반복문의 연습을 위해서 간단한 문제 5가지를 만들어 보고 그걸 풀어보는 시간을 가졌다

또, 다른 분들의 문제도 풀어보면서 내가 어떤 문제들에 어려움을 많이 느끼는지 체크해 봤다

 

 

 

문제 1.

  • 정수 num1과 num2를 입력받아 숫자를 비교해서 더 큰 수 출력하기
    (단, num1 != num2)

 

예시)

  • 입력 값 : 5, 10
    출력 값 : 10

 

문제 1. 코드

class Test1 {

    fun test(){
        val num1 = 5
        val num2 = 10

        if (num1>num2){
            println("$num1")
        } else {
            println("$num2")
        }
    }
}

 

 

문제 2.

  • 정수들이 담긴 배열 arr에서 가장 큰 수를 출력하기
    arr : [51, 25, 68, 40, 34, 55]

 

예시)

  • 출력 값 : 68

 

문제 2. 코드

class Test2 {

    fun test(){
        val arr = arrayOf<Int>(51,25,68,40,34,55)

        // 오름차순 정렬 후 arr 마지막 인덱스 출력
        arr.sort()
        println("${arr[arr.size-1]}")
        // max() 사용
        println("${arr.max()}")
    }
}

 

 

문제 3.

  • 1부터 100까지의 수 중 2의 배수이지만 3의 배수는 아닌 수 출력하기

 

예시)

  • 출력 : 2, 4, 8, 10, 14 .. 94, 98, 100

 

문제 3. 코드

class Test3 {

    fun test(){
        for(i in 1..100){
            if(i%2==0 && !(i%3==0)){
                println("$i")
            }
        }
    }
}

 

 

문제 4.

  • 정수 num1과 num2를 입력받아 두 수 사이의 합 출력하기

 

예시)

  • 입력 : 3, 5
    출력 : 12

 

문제 4. 코드

class Test4 {

    fun test() {
        val num1 = 3
        val num2 = 5
        var answer = 0

        if(num1 > num2){
            for(i in num2..num1){
                answer += i
            }
        } else {
            for(i in num1.. num2){
                answer += i
            }
        }
        println("$answer")
    }
}

 

 

문제 4.

  • 정수들이 담긴 배열 arr에서 자연수 n보다 큰 수의 개수 출력하기
    arr : [23, 52, 13, 26, 10, 7]
    n : 20

 

예시)

  • 출력 : 3

 

문제 4. 코드

class Test5 {
    fun test(){
        val arr = arrayOf<Int>(23,52,13,26,10,7)
        val n = 20
        var answer = 0

        for(i in 0 until arr.size){
            if(arr[i] > n){
                answer ++
            }
        }
        println("$answer")
    }
}

 

 

 


 

 

 

다른 분들의 문제를 풀다가 깨달은 것 중 하나는, 내가 유독 별 찍기만 나오면 어려움을 많이 느꼈다는 것이다

예를 들어, 숫자(n)를 입력받아 피라미드 형태나 다이아몬드 형태로 별("*")을 찍어내는 문제들이다

 

입력받은 숫자의 길이만큼 차례대로 증가하는 별 찍기

val n = readLine()!!.toInt()

for(i in 1 .. n){
	for(j in 1..i){
    	print("*")
    }
    println()
}

// 이 방법말고도
(("*").repeat(n)+"\n").repeat(n)
// 를 활용해봤으나 for문이 뭔가 활용 할 방법이 많아질 것 같아서 for문을 이용했음

// 출력 (n = 4 가정)
*
**
***
****

위처럼 그냥 숫자를 입력받고 그 숫자만큼의 길이로 차례대로 증가하는 별 찍기는 성공했으나,

피라미드(이등변 삼각형) 모양이나 다이아몬드(마름모) 모양에 어려움을 느꼈다

 

입력받은 숫자의 길이만큼 피라미드 모양으로 별 찍기

val number = readLine()!!.toInt()

for( line in 1..number ) {
    // 공백 number - 1 .. 0
    // 공백 출력 for문
    for( i in number - line downTo 1 ) {
    // number가 4면 i는 3, 2, 1이 된다 => 맨처음 줄의 공백(" ")이 3, 2, 1 순으로 줄어듬
        print(" ")
    }
    // 별 모양(*) 출력 for 문
    // 1 3 5 7 9 ... 2 * number-line + 1
    for( i in 1 until 2 * line  ) {
    print('*')
    }
    // 줄 바꿈
    println()
        
        
// 출력 (number = 4 가정)
   *
  ***
 *****
*******

생각해 보니까 나는 줄 당 별의 개수가 1개씩 늘어난다고 생각했는데,

양 옆으로 1개씩(줄당 두 개씩) 늘어난다는 사실을 망각하고 있었다

(별 앞의 공백을 이용해서 별이 가운데 있는 것처럼 보이게 한다)

 

  • 입력받은 number는 높이, 그 안에서 각각 공백과 별의 반복을 시킨다(둘 다 for문 안에서 print를 사용해 한 줄에 출력시킨 후 number의 for문에 println을 이용해서 줄을 바꾸도록 한다)
  • 4를 입력했다고 치면, 공백은 4 downTo 1 / 별은 1 until 2*line이다
    공백(" ") 4-1 하고(세 칸 띄우고), "*" 1개(i = 1) 생성
    공백(" ") 4-2 하고(두 칸 띄우고), "*" 3개(i = until 2*2 = 3) 생성
    공백(" ") 4-3 하고(한 칸 띄우고), "*" 5개(i = until 2*3 = 5) 생성
    공백(" ") 4-4 하고(0칸 띄우고 = 공백 x), "*" 7개(i = until 2*4 = 7) 생성

 

 

입력받은 숫자의 길이를 기준으로 위아래로 줄어드는 다이아몬드 모양의 별 찍기

val number = readLine()!!.toInt()

        for (line in 1..number) {
            // 공백 출력 for문
            for (i in number-line downTo 1) {
                print(" ")
            }

            // 별 모양(*) 출력 for 문
            for (i in 1 until 2 * line) {
                print('*')
            }

            println()   // 줄 바꿈
        }

        // 위 피라미드에서 4번째 줄(*******)이 있기 때문에 until로 number전 까지만
        for (line in 1 until number) {
            // 공백 출력 for문
            // 피라미드의 반대로 공백의 개수 = 1, 2, 3
            for (i in 1..line) {
                print(" ")
            }
            // 별 모양(*) 출력 for 문 피라미드의 반대로
            // 4번째 줄(number)부터 내려가면서 줄어드는 모양이기 때문
            // 2*(number-line) downTo 1하면 별이 6개 만들어짐
            for (i in 1 until 2 * (number - line)) {
                print('*')
            }
            // 줄 바꿈
            println()
        }
    }

다이아몬드(마름모) 모양은 피라미드의 공백과 별 반복문을 반대인 for문을 추가해준다

728x90