이번주는 첫번째 주라 그런지 특별한 일정이 없어서 사전캠프에서 하던 코드카타를 푸는 시간을 가졌다. 그중 내가 많은 시간을 할애한 문제가 있다. '바탕화면 정리'라는 문제는 결과를 알고 보면 쉬웠지만, 시작은 어려웠다..
문제설명

위 사진과 같이 파일이 어떤 위치에 있다면, 해당 파일들을 드래그 할 수 있는 가장 작은 범위를 구하는 문제였다. 입출력을 예로 들어보면

이렇게 .으로 표시된 부분은 공백, #으로 되어있는부분에 파일이 있다고 생각하면 된다.
드래그의 시작부분과 마지막부분을 배열에 넣어서 결과값을 리턴해야한다.
먼저 처음에 내가 푼 방식은
class Solution {
fun solution(wallpaper: Array<String>): IntArray {
var answer: IntArray = IntArray(4)
var i = 0
var sArray: IntArray = intArrayOf(50,50)
var eArray: IntArray = intArrayOf(0,0)
for(words in wallpaper){
for(word in words){
if(word.toString() == "#"){
var myIndex = words.indexOf(word)
if(sArray[0]>i){
sArray.set(0,i)
}
if(sArray[1]>myIndex){
sArray.set(1,myIndex)
}
if(eArray[0]<=i){
eArray.set(0,i+1)
}
if(eArray[1]<=myIndex){
eArray.set(1,myIndex+1)
}
}
}
i++
}
answer[0] = sArray[0]
answer[1] = sArray[1]
answer[2] = eArray[0]
answer[3] = eArray[1]
return answer
}
};
이러했다. 아무생각없이, 이렇게해야하나 저렇게 해야하나 고민하다가 써내려가기 시작했고, 코드를 작성했다. 이 코드는 약간의 문제가 있었다.. 아니 많이..
sArray에 대해서는 문제없이 구해졌지만 eArray에서 같은줄에 #이 두개이상 존재한다면 첫번째 위치의 인덱스값만 가져와져서 원하는 답을 얻을 수 없었다..
코드를 지우고, 튜터님과 공부하며 다시 작성한 코드는!!
class Solution {
fun solution(wallpaper: Array<String>): IntArray {
var minRow = Int.MAX_VALUE
var minCol = Int.MAX_VALUE
var maxRow = Int.MIN_VALUE
var maxCol = Int.MIN_VALUE
var row = wallpaper.size
var col = wallpaper[0].length
for(i in 0 until row){
for(j in 0 until col){
if(wallpaper[i][j]=='#'){
minRow = minOf(minRow, i)
minCol = minOf(minCol, j)
maxRow = maxOf(maxRow, i)
maxCol = maxOf(maxCol, j)
}
}
}
return intArrayOf(minRow,minCol,maxRow+1,maxCol+1)
}
}
더 짧고, 가독성좋고 간결해졌다. 가로,세로의 최소 최대값을 구해주면 되는 생각만 잘 했다면 더 쉽게 풀었을 문제였다..
오늘의 결론.?? -> 알고리즘을 풀때, 무작정, 생각없이 쓰지 말고 먼저 어떤식으로 해야 답이 나올지, 어떻게 해야할지 먼저 생각해보고 코드를 작성하자!