본문 바로가기

Study/Kotlin Study

[Kotlin] 루프 (반복문)

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

do - while 문

1. do - while 사이의 루프 몸통을 실행한다.

2. while 키워드 다음에 있는 조건을 평가한다.

3. 참이면 1로 돌아가고, 거짓이면 루프문 다음 문장을 실행한다.

fun main() {
    var sum = 0
    
    // 0을 입력 받을 때까지 수들의 합을 반환
    do {
        val num = readLine()!!.toInt() // var보다는 val을 지향할 것
        sum += num
    } while (num != 0)

    println("Sum: $sum")
}

while 문

- 1 ~ 101까지 수 중 하나 맞추기 (Up Down 게임)

import kotlin.random.Random

fun main() {
    val num = Random.nextInt(1, 101)
    // 1부터 101까지의 수들 중 난수 생성
    var guess = 0

    while (guess != num) { // 난수 num을 맞출 때까지 반복
        guess = readLine()!!.toInt()
        if (guess < num) println("Too Small")
        else if (guess > num) println("Too big")
    }
    println("Right: it's $num")
}

- pdf 코드 오류: readLine => readLine()

 

- 더 좋은 코드: while문을 do-while문으로 바꾸고, var을 val로 변경한다.

import kotlin.random.Random

fun main() {
    val num = Random.nextInt(1, 101)
    // 1부터 101까지의 수들 중 난수 생성

    do { 
        val guess = readLine()!!.toInt() 
        // val로 변경, 처음 루프를 돌기 위해서는 guess가 필요하지 않고 그냥 실행되므로 가능하다.
        if (guess < num) println("Too Small")
        else if (guess > num) println("Too big")
    } while (guess != num) // 난수 num을 맞출 때까지 반복
    
    println("Right: it's $num")
}

for 문

- 배열의 총 합 구하기

fun main() {
    val a = IntArray(10) {it * it} // 0, 1, 4, 9, 16 ...
    var sum = 0
    
    // 배열 a의 값 모두 더하기
    for (x in a) { // x는 iteration마다 불변 변수로 작동 (val)
        sum += x
    }
    println("Sum: $sum") // 285
}

 

- 배열의 인덱스로 접근하여 총 합 구하기

fun main() {
    val a = IntArray(10) {it * it} // 0, 1, 4, 9, 16 ...
    var sum = 0

    // 배열 a의 값 모두 더하기
    for (i in 0 .. a.lastIndex) { // i는 0부터 a의 마지막 인덱스까지
        sum += a[i]
    }
    println("Sum: $sum") // 285
}

 

- indices 함수를 이용하여 총 합 구하기

fun main() {
    val a = IntArray(10) {it * it} // 0, 1, 4, 9, 16 ...
    var sum = 0

    // 배열 a의 값 모두 더하기
    for (i in a.indices) { // i는 a의 모든 인덱스를 갖는다.
        sum += a[i]
    }
    println("Sum: $sum") // 285
}

break 문

- break 문을 사용한 1 ~ 101까지 수 중 하나 맞추기 코드 1 (Up Down 게임)

import kotlin.random.Random

fun main() {
    val num = Random.nextInt(1, 101)
    // 1부터 101까지의 수들 중 난수 생성

    while (true) { // 무한 루프
        val guess = readLine()!!.toInt()
        
        if (guess < num) println("Small")
        else if (guess > num) println("Big")
        else break // guess == num 이면 = break
    }
    println("Right: it's $num")
}

- break 문을 사용한 1 ~ 101까지 수 중 하나 맞추기 코드 2 (Up Down 게임)

import kotlin.random.Random

fun main() {
    val num = Random.nextInt(1, 101)
    // 1부터 101까지의 수들 중 난수 생성

    while (true) { // 무한 루프
        val guess = readLine()!!.toInt()
        val message =
            if (guess < num) "Small"
            else if (guess > num) "Big"
            else break // guess == num 이면 = break
        println(message)
    }
    println("Right: it's $num")
}

continue 문

- 주어진 문자열에서 각 알파벳 등장 횟수를 저장한 리스트를 반환하는 함수

fun main() {
    val text = readLine()!!
    val counts = countLetters(text)

    for (i in counts.indices)
        println("${'a' + i}: ${counts[i]}")
}

fun countLetters(text: String): IntArray {
    val counts= IntArray('z' - 'a' + 1)
    // 알파벳 개수 크기의 Int형 배열 (모든 요소가 0으로 초기화)

    for (char in text) {
        val charLower = char.toLowerCase() // charLower는 char를 소문자로 변경한 값

        if (charLower !in 'a'..'z') continue // charLower가 소문자가 아니라면
        counts[charLower - 'a'] ++ // a: 0, b: 1, c: 2 인덱스에 개수 저장
    }
    return counts
}

내포된 루프와 레이블

- break와 continue 문은 가장 안쪽의 루프에 적용된다.

- 이를 바깥쪽 루프에 적용 시키고 싶을 때 레이블 사용한다.

fun main() {
    val arr = intArrayOf(2, 7, 3, 4, 6, 9, 4, 2)
    val sub = intArrayOf(4, 2, 7)

    println(indexOf(sub, arr))
}

// 하나의 정수 배열 (array) 내에서 하위 배열(subarray)이 시작하는 인덱스를 찾는 함수
fun indexOf(subarray: IntArray, array: IntArray): Int {
    outerLoop@for (i in array.indices) { // outerLoop@ 라벨로 라벨링
        for (j in subarray.indices) {
            if (i + j >= array.size || subarray[j] != array[i + j]) continue@outerLoop // outerLoop@가 있는 바깥 루프로 빠져나감
            // 현재 검사 중인 subarray와 array의 요소가 다르면 array의 다음 인덱스 부터 다시 탐색
            // i + j >= array.size ||를 추가해 인덱스 범위를 벗어나는 에러를 제거
        }
        return i // subarray의 모든 요소가 array에 차례대로 존재한다면 i 반환 (@outerLoop에 걸리지 않음)
    }
    return -1 // 모든 탐색이 끝났는데도 array내에서 subarray를 찾지 못했다면 -1 반환
}

- pdf 코드 오류: ArrayIndexOutOfBoundsException 발생 => i + j >= array.size || 추가

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 클래스 정의하기  (1) 2023.08.28
[Kotlin] 예외 처리  (0) 2023.08.25
[Kotlin] 조건문  (2) 2023.08.23
[Kotlin] 패키지: 패키지 개요  (2) 2023.08.22
[Kotlin] 증가 감소 연산자  (1) 2023.08.20