[강의] 코딩 훈련 교본 (코틀린 편) – 14. 여섯번째 퀴즈

본 강의는 코틀린(Kotlin)의 문법강의가 아닌, 프로그래밍 훈련을 위한 강의입니다. 따라서, 본 강의에서 알려드리는 내용만으로 코딩훈련에 임하시기 바랍니다. ※ 퀴즈는 “프로그래머의 길(PWAY)”에서 발췌하였습니다. – 저도 이 책으로 입문했습니다.

Kotlin Playground에서 풀기

[Quiz 1]

문제 : 홀수 마방진 프로그램을 작성하시오.

조건 : 예상 결과와 결과값이 같아야 한다.

예상 결과:

n = 3
   8   1   6
   3   5   7
   4   9   2
   
n = 5
  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

홀수 마방진 규칙

  1. 주어진 배열의 첫번째행 가운데에서 시작한다.
  2. 1의 위치에서 대각선 오른쪽 위로 이동해서 다음 숫자를 넣는다.
  3. 첫줄 다음은 맨 아랫줄이다.
  4. 마지막 칸의 다음은 첫 칸이다.
  5. 진행하려는 칸에 이미 숫자가 있을 경우에는 원래 칸에서 밑으로 내려간다.

마방진에 값을 넣는 방식은 아래와 같이 한다.

// 줄 y와 칸 x의 초기값을 준다
y = 0
x = n / 2
for(i in 0 until n * n){
    // 배열에 값을 넣는다.
    arr[y][x] = i + 1
    // 다음 위치 x, y를 아래에서 규칙을 따라서 구한다.
}

[Quiz 2]

*문제 : (i # j)의 값이 짝수인지 홀수인지에 따라서 0이나 1을 출력하는 프로그램을 작성하시오. #은 사칙연산(+, -, , /) 중의 하나임.

**조건 : i, j 이외의 변수는 사용하지 않고 배열에 값을 넣는다. 배열에 값을 넣을 때 사용하는 코드(if문도 사용하지 않는다.) **

힌트 :

for(i in 0 until n){
    for(j in 0 until n){
        arr[i][j] = (i, j의 식) % 2
    }
}

예상 결과:

n = 5
   1   0   1   0   1
   0   1   0   1   0
   1   0   1   0   1
   0   1   0   1   0
   1   0   1   0   1

[Quiz 3]

문제 : 퀴즈 2번의 응용 문제

조건 : 예상 결과와 결과값이 같아야 한다.

힌트 :

for(i in 0 until n){
    for(j in 0 until n){
        arr[i][j] = (i, j의 식) % 2
    }
}

예상 결과:

n = 6
   1   1   0   0   1   1
   1   1   0   0   1   1
   0   0   1   1   0   0
   0   0   1   1   0   0
   1   1   0   0   1   1
   1   1   0   0   1   1

[Quiz 4]

문제 : 퀴즈 2번의 응용문제

조건 : 예상 결과와 결과값이 같아야 한다.

힌트 :

for(i in 0 until n){
    for(j in 0 until n){
        arr[i][j] = (i, j의 식) % 2
    }
}

예상 결과:

n = 6
   1   1   1   0   0   0
   1   1   1   0   0   0
   1   1   1   0   0   0
   0   0   0   1   1   1
   0   0   0   1   1   1
   0   0   0   1   1   1

퀴즈 2, 3, 4는 거의 같은문제입니다. 값 하나로 조절 가능해야 합니다.

개미 수열

개미수열을 풀기위한 준비

fun main(args: Array<String>){
    var n = 5
    var i = 0
    while(i < n){
        println("%4d".format(i))
        i++
    }
}

위 프로그램은 다음 프로그램과 같습니다.

fun main(args: Array<String>){
    for(i in 0 until n){
        println("%4d".format(i))
    }
}

while문은 위와 같이 for문과 그 성격이 같지만, 오직 조건에 의해서만 반복을 할지 말지를 결정하는 반복문입니다.

fun main(args: Array<String>){
    val a = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0)
    println("Print the contents of array a[]")
    var i = 0
    while (a[i] > 0) {
        println("i=%4d ".format(a[i]))
        i++
    }
}

결과 :

i=   1 
i=   2 
i=   3 
i=   4 
i=   5 
i=   6 
i=   7 
i=   8 
i=   9 
i=  10 

위의 경우에 1차원 배열 a[]는 처음 만들때 값을 넣어서 초기화하는 방식입니다. 배열의 끝에 입력한 0을 보고 어떻게 프로그램이 종료할 수 있었는지 생각해보시기 바랍니다.

fun main(args: Array<String>){
    val a = intArrayOf(11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 0)
    var i = 0
    while (a[i] > 0) {
        if (a[i] > 10) {
            print("big ")
        } else {
            print("small ")
        }
        i++
    }
}

결과 :

big big big big big small small small small small

배열의 숫자를 데이터로 활용하여 새로운 결과물을 만드는 방법입니다.

이걸 break 키워드를 활용하여 바꿔보겠습니다.

fun main(args: Array<String>){
    val a = intArrayOf(11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 0)
    var i = 0
    while (true) {
        if (a[i] <= 0) {
            break
        }
        if (a[i] > 10) {
            print("big ")
        } else {
            print("small ")
        }
        i += 1
    }
}

결과 :

big big big big big small small small small small

위의 while(true)에서 true는 항상 참이라는 뜻입니다. 이 프로그램이 실행되는 순간 영원히 멈주지 않는 프로그램이 됩니다. 이런 경우에 while문을 빠져나오기 위해 break 키워드를 사용할 수 있습니다. 이 모든것이 개미수열을 위한 준비운동이니 이것저것 바꿔가면서 익혀보시기 바랍니다.

fun main(args: Array<String>){
    val a = intArrayOf(11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 0)
    val b = IntArray(100)
    var i = 0
    while (a[i] > 0) { // a[]배열을 b[]배열에 복사 하는 프로그램
        b[i] = a[i]
        i++
    }

    println("Print the array b[]")
    i = 0
    while (b[i] > 0) {
        print("%4d".format(b[i]))
        i++
    }
}

결과 :

Print the array b[]
  11  12  13  14  15   6   7   8   9  10

위 프로그램은 a[]배열에서 b[]배열로 복사하는 프로그램입니다.

[Quiz 5]

문제 : 다음은 베르나르베르베르 소설에 나오는 개미수열이다. 이 수열을 프로그램으로 구현하라.

**수열 : **

   1
   1   1
   1   1   2   1
   1   2   2   1   1   1
   1   1   2   2   1   3
   1   2   2   2   1   1   3   1
   1   1   2   3   1   2   3   1   1   1
   1   2   2   1   3   1   1   1   2   1   3   1   1   3
   1   1   2   2   1   1   3   1   1   3   2   1   1   1   3   1   1   2   3   1
   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

조건 : 예상 결과와 결과값이 같아야 한다.

힌트 :

  1. 첫줄에서 둘째줄이 나오고, 둘째줄에서 셋째줄이 나오고, 셋째줄에서 넷째줄이 나옵니다.
  2. 첫번째 a[]에서 기본값으로 출발, a[]에서 비롯하여, b[]배열을 만들고, b[]를 출력하고, b[]를 a[]에 복사합니다.
  3. 다시 a[]에서 비롯하여, b[]배열을 만들고, b[]를 출력하고…………..

예상 결과:

n = 5
   1
   1   1
   1   1   2   1
   1   2   2   1   1   1
   1   1   2   2   1   3

[이전글] [강의] 코딩 훈련 교본 (코틀린 편) – 13. 다섯번째 퀴즈

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x