본 강의는 코틀린(Kotlin)의 문법강의가 아닌, 프로그래밍 훈련을 위한 강의입니다. 따라서, 본 강의에서 알려드리는 내용만으로 코딩훈련에 임하시기 바랍니다.
Level up
퀴즈는 다 풀고 오셨나요? 프로그래밍 언어는 문법을 공부하는 것보다 중요한 것이 프로그램을 짜는 훈련을 많이 해야한다는 것입니다. 운전을 잘하려면 운전을 많이 해야하고, 축구를 잘하려면 축구를 많이 해야하는 것과 같습니다.
하지만 무작정 많이 한다고 실력이 계속 늘지 않습니다. 확실한 실력 향상을 위해서는 어떤 기술이나 그렇듯이 기초가 탄탄해야하고, 기초훈련을 해야 합니다. 바로 여기서 소개해드리는 퀴즈들이 일종의 기초훈련입니다.
반드시 정답을 보지 말고 직접 고민해서 풀어보시고, 안풀리면 잠깐 쉬었다가 다시 고민하세요. 답을 보는 순간 그 문제는 절대 내것이 될 수 없습니다. 이것은 영화의 스포일러를 보는 것과 같습니다. 프로그래머가 적성인지 알고싶으신가요? 퀴즈 푸는 것이 재미있다면 적성이 맞는것입니다. 빨리 풀고, 늦게 풀고는 중요하지 않습니다. 끝내 풀어내는 인내심이 중요합니다.
문제를 다 풀고 오셨다면 이제 한단계 레벨업 할때가 되었습니다.
배열
배열은 여러 값들을 효율적으로 관리하기 위한 자료구조입니다. 학교에서는 학생들을 효율적으로 관리하기 위해서 학년과 반이 나뉘어져있고, 아파트는 동, 층, 호수로 나뉘어져 있습니다. 이들 모두는 번호로 관리되듯이 배열도 각각의 값의 위치를 접근할 수 있는 인덱스 번호가 있습니다.
먼저 다음 소스코드부터 실행해보겠습니다.
fun main(args: Array<String>){ var n = 5 var arr = Array(n) { 0 } var count = 1 for(i in 0 until n){ arr[i] = count++ } println(\"n = $n\") for(number in arr) { print(\"%4d\".format(number)) } println() }
결과값은 4장의 반복문 예제의 결과와 동일합니다. 하지만 그때와 다른 점은 자료가 저장되어 있느냐, 없느냐입니다. 위 코드는 두번의 for문으로 이루어져 있습니다. 첫번째 for문은 값을 입력하는 for문이고, 두번째 for문은 값을 출력하는 for문입니다.
먼저 배열의 선언은 다음과 같이 합니다.
var arr = Array(n) { 0 }
Array() 함수로 배열을 생성하게 되고, 첫번째 인자값 n은 배열의 사이즈, 두번째 인자값 {0}은 초기화시킬 값입니다.
for(i in 0 until n){ arr[i] = count++ }
다음 for문은 값을 입력하는 부분입니다. for문이 이전처럼 \”1 .. n\” 이란 범위를 사용하지 않고, \”0부터 n까지\” 라는 뜻의 \”0 until n\”으로 표기했습니다. 이러면 반복되는 i의 값은 0, 1, 2, 3, 4 이런식으로 값이 들어가게 됩니다. 이렇게 사용하는 이유는 배열의 인덱스 접근은 0부터 시작되기 때문입니다.
for(number in arr) { print(\"%4d\".format(number)) }
여기서도 이전에 사용하던 for문의 형태와는 다릅니다. \”number in arr\”의 뜻은 영어를 이해하셨다면 알 수 있듯이 \”arr 배열을 순회하고, number에 값을 넣는다\” 라는 뜻이 됩니다.
이것을 전에 사용하던 방식으로 바꿔보면,
for(i in 0 until n) { print(\"%4d\".format(arr[i])) }
이런식으로 표기할 수 있습니다. 어떤걸 사용하는지는 프로그래머의 자유이지만 좀더 추천하는 방식은 새롭게 알려드린 방식입니다. 인덱스 번호를 통한 접근은 혹시 인덱스를 잘못 접근할 경우 오류를 발생시키기 때문입니다. arr의 방을 5개만 만들었는데, 10번째 방을 접근하려고 arr[10]을 접근하면 프로그램이 죽어버립니다. 하지만 우리는 이차원 배열을 행과 열로 구분하여 출력하기 위해 기존의 방식을 사용할 것입니다.
일단 한줄한줄 이해가 되지 않더라도 그냥 실행해보고, 바꿔보면서 연습하겠습니다.
이차원 배열
지금까지가 선형으로 이루어진 일차원배열이었고, 우리가 진짜 다룰 이차원 배열을 배워보겠습니다. 이차원 배열은 아파트의 번호체계와 비슷합니다. 3층 3호면 303호, 5층 3호면 503호이듯이 이차원 배열도 열번호와 행번호로 우리가 원하는 값에 접근하게 됩니다.
일단 실행해보겠습니다.
fun main(args: Array<String>){ var n = 5 var arr = Array(n) { Array(n) { 0 } } var count = 1 for(i in 0 until n){ for(j in 0 until n){ arr[i][j] = count++ } } println(\"n = $n\") for(i in 0 until n) { for(j in 0 until n) { print(\"%4d\".format(arr[i][j])) } println() } }
결과 :
n = 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
이차원 배열 선언부를 보겠습니다.
var arr = Array(n) { Array(n) { 0 } }
이 구문을 해석해보면,
var arr = Array(사이즈) { 초기값(Array(사이즈) { 초기값(0) }) }
이해가 가셨나요? 안가셨다면 일단 사용합니다. 일차원 배열의 초기값을 다시 일차원 배열을 넣었습니다. 이건 아파트 1층에 1호 ~ 4호까지 넣고 싶은 것과 동일합니다. 1층, 2층이 있고, 1호, 2호가 있는 형태입니다.
조작을 바꿔가면서 보겠습니다.
Sample 1
fun main(args: Array<String>){ var n = 5 var arr = Array(n) { Array(n) { 0 } } var count = 1 for(i in 0 until n){ for(j in 0 until n){ arr[j][i] = count++ } } println(\"n = $n\") for(i in 0 until n) { for(j in 0 until n) { print(\"%4d\".format(arr[i][j])) } println() } }
결과 :
n = 5
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
Sample 2
fun main(args: Array<String>){ var n = 5 var arr = Array(n) { Array(n) { 0 } } var count = 1 for(i in 0 until n){ for(j in 0 until n){ arr[n - i - 1][n - j - 1] = count++ } } println(\"n = $n\") for(i in 0 until n) { for(j in 0 until n) { print(\"%4d\".format(arr[i][j])) } println() } }
결과 :
n = 5
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
Sample 3
fun main(args: Array<String>){ var n = 5 var arr = Array(n) { Array(n) { 0 } } var count = 1 for(i in 0 until n){ for(j in 0 until n){ arr[n - j - 1][n - i - 1] = count++ } } println(\"n = $n\") for(i in 0 until n) { for(j in 0 until n) { print(\"%4d\".format(arr[i][j])) } println() } }
결과 :
n = 5
25 20 15 10 5
24 19 14 9 4
23 18 13 8 3
22 17 12 7 2
21 16 11 6 1
나머지 코드는 퀴즈를 풀면서 연습을 많이 하셨기때문에 자연스럽게 이해하셨으리라 생각됩니다. 이제 다음 장에서 퀴즈를 풀어보겠습니다.