프로그래밍/Algorithm

M X N 행렬의 한 원소가 0이라면, 해당 원소가 속한 행과 열의 모든 원소를 0으로 바꾸는 함수를 작성하라

모지사바하 2015. 8. 4. 17:02
/**
* Created by kwo2002 on 2015-08-04.
*/
object MatrixZero {

def getZeroElemIndex(matrix: Array[Array[Int]]): Array[Array[Int]] = {

def go(i: Int, j: Int): (Int, Int) = {
if (i > matrix.length) {
(-1, -1)
} else {
if (matrix(i)(j) == 0) {
(i, j)
} else {
if (j >= matrix(i).length - 1) {
go(i + 1, 0)
} else {
go(i, j + 1)
}
}
}
}

val zeroIndex: (Int, Int) = go(0, 0)

if (zeroIndex._1 >= 0) {
modElemToZero(zeroIndex, matrix)
} else {
matrix
}
}

def modElemToZero(zeroIndex: (Int, Int), matrix: Array[Array[Int]]): Array[Array[Int]] = {
val zeroMatrix = matrix.clone()

def loop(n: Int): Array[Array[Int]] = {

zeroMatrix(zeroIndex._1)(n) = 0
zeroMatrix(n)(zeroIndex._2) = 0

if (n >= matrix.length - 1) {
zeroMatrix
} else {
loop(n + 1)
}
}

loop(0)

}

def main(args: Array[String]) {
print(getZeroElemIndex(Array(Array(1, 2, 3), Array(4, 0, 6), Array(7, 8, 9))).deep)
}

}

회고.

우선, 배열에서 0인 원소의 행과 열의 인덱스를 먼저 구한다. - getZeroElemIndex

배열의 길이만큼 loop 하여 인덱스에 해당하는 행과 열의 배열원소를 0으로 바꾼다. - modElemToZero


배열의 원소를 0으로 바꿀 때, loop를 안돌고 array(i)(_) = 0 과 같은 문법이 가능할 줄 알았는데 안되더라.. 

코드가 뭔가 약간 함수형 프로그래밍과 안어울리는 느낌이 든다.. 함수 내부에서 부수적인 행동을 안하긴 했지만,, 어딘가 맘에 안듬.


현재는 0인 원소 하나에 대해서만 작동한다.

0인 원소가 2개이상일때에 대해서도 작동하도록 수정해보자