본문 바로가기
스터디(beakjoon)

Kotlin] 백준 2738번 문제풀이

by 김마리님 2023. 6. 13.

https://www.acmicpc.net/problem/2738

 

2738번: 행렬 덧셈

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같

www.acmicpc.net

 

 

풀이

더보기

2차원 행렬에 대한 문제이다.

2차원 행렬은 리스트 내에 리스트를 넣어 보통 만든다. 그렇게 되면

[[1, 2, 3], [4, 5, 6]]의 형태를 지닌다.

 

2개의 행렬이 주어진다고 했으므로, 2개의 행렬이 저장될 2개의 전역변수를 선언한다.

이 때 mutableList<mutableList<Int>>로 선언하여 행렬 내에 행렬이 들어가도록 한다.

 

첫 줄에는 행렬의 행과 열이 주어진다.

이 때, 2개의 행렬이 들어온다 했으므로 다음에 들어올 데이터의 수도 얼추 짐작할 수 있다, 행의 2배이다.

따라서, for문을 1부터 ~(처음 들어온 값의 앞 숫자 *2) 만큼 회전시킨다.

이제부터 반복문을 돌려, 받아온 값을 정수 리스트화 하여 앞서 만든 전역변수에 넣는다. (list<String>.map { it.toInt() } 를 통해 문자열 배열을 정수배열로 만들 수 있다) 이 때, 만일 인덱스가 행의 넘어서는 순간 두 번째 행렬이라는 소리이므로 이를 if로 구분지어 넣는다.

 

이제 같은 모양의 행렬이므로 만들어진 전역변수 배열 리스트를 반복문으로 한 줄 씩 회전하고, 또 내부에서 이중 반복문을 통해 각 줄의 요소를 더하는데, 두번째 행렬 리스트와 일치하는 인덱스를 찾아 더한다. 다 더해졌다면 배열을 문자열로 변경하여(joinToString)출력한다.

 

fun main(args: Array<String>) {
    question2783()
}

fun question2783() {
    var arrayType = readLine()!!.split(" ").map { it.toInt() }

    var firstArray = mutableListOf<MutableList<Int>>()
    var secondArray = mutableListOf<MutableList<Int>>()

    for(i in 1 .. (arrayType[0] * 2)) {
        var item = readLine()!!.split(" ").map { it.toInt() }.toMutableList()
        if(i <= arrayType[0]) { firstArray.add(item) } else { secondArray.add(item) }
    }

    for(i in 0 until firstArray.size) {
        for(j in 0 until firstArray[i].size) {
            firstArray[i][j] += secondArray[i][j]

        }
        println(firstArray[i].joinToString(" "))
    }

}
반응형