2023.11.20(월) TIL

quinones·2023년 11월 24일

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

문제설명

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

이렇게 .으로 표시된 부분은 공백, #으로 되어있는부분에 파일이 있다고 생각하면 된다.

드래그의 시작부분과 마지막부분을 배열에 넣어서 결과값을 리턴해야한다.

먼저 처음에 내가 푼 방식은

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)
    }
}

더 짧고, 가독성좋고 간결해졌다. 가로,세로의 최소 최대값을 구해주면 되는 생각만 잘 했다면 더 쉽게 풀었을 문제였다..

오늘의 결론.?? -> 알고리즘을 풀때, 무작정, 생각없이 쓰지 말고 먼저 어떤식으로 해야 답이 나올지, 어떻게 해야할지 먼저 생각해보고 코드를 작성하자!

profile
이우진

0개의 댓글