본 강의는 코틀린(Kotlin)의 문법강의가 아닌, 프로그래밍 훈련을 위한 강의입니다. 따라서, 본 강의에서 알려드리는 내용만으로 코딩훈련에 임하시기 바랍니다. ※ 퀴즈는 “프로그래머의 길(PWAY)”에서 발췌하였습니다. – 저도 이 책으로 입문했습니다.
[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의 위치에서 대각선 오른쪽 위로 이동해서 다음 숫자를 넣는다.
- 첫줄 다음은 맨 아랫줄이다.
- 마지막 칸의 다음은 첫 칸이다.
- 진행하려는 칸에 이미 숫자가 있을 경우에는 원래 칸에서 밑으로 내려간다.
마방진에 값을 넣는 방식은 아래와 같이 한다.
// 줄 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
. . . . . . . . . . . . . . . . . . . .
조건 : 예상 결과와 결과값이 같아야 한다.
힌트 :
- 첫줄에서 둘째줄이 나오고, 둘째줄에서 셋째줄이 나오고, 셋째줄에서 넷째줄이 나옵니다.
- 첫번째 a[]에서 기본값으로 출발, a[]에서 비롯하여, b[]배열을 만들고, b[]를 출력하고, b[]를 a[]에 복사합니다.
- 다시 a[]에서 비롯하여, b[]배열을 만들고, b[]를 출력하고…………..
예상 결과:
n = 5
1
1 1
1 1 2 1
1 2 2 1 1 1
1 1 2 2 1 3