2023.12.01(금) TIL

quinones·2023년 12월 1일

오늘은 programmers 에서 n^2배열 자르기 문제를 풀었다.
n=3, left=2, right=5라고 주어졌을때 nXn 행렬을 만드는데,

인덱스가 left=2부터 right=5까지인 3,2,2,3을 출력시켜주면 되는 문제다.

3단계레벨 문제치고 어렵지 않다 생각했고, 2차원 배열을 만들어서 각각의 숫자를 집어넣고, 해당값들을 리스트에 다 넣어서 일렬로 펼쳐준후에, 원하는 인덱스 값을 추출하는 방식으로 풀어야 겠다 생각했고, 성공적이였다.

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {

        val array = Array(n){ IntArray(n) }
        val myList = mutableListOf<Int>()
        for(i in 0 until n){
            for(j in 0 until n){
                var maxValue = maxOf(i,j) + 1
                array[i][j] = maxValue
                myList.add(maxValue)
            }
        }
        val finalList = mutableListOf<Int>()
        for(k in left..right){
            var wantValue = myList.get(k.toInt())
            finalList.add(wantValue)
        }
        return finalList.toIntArray()
    }
}

2중 for문을 사용해서 배열에 값을 넣어주고, 원하는 값을 성공적으로 추출할수 있었다. 하지만 이 문제에는 제한사항이 있었다..

n의 범위가 너무 크다.. 최대
10000000X10000000크기의 행렬이 만들어진다.. 위 방법으로 진행하면 2중 for문을 돌려 너무 느리고, 메모리 초과가 나오게 된다..

해결하기 위해서는 내가 추출하려는 부분만! 값을 넣어 가져와야한다. 그래서 다시 작성한 코드는

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        val answer = IntArray((right - left + 1).toInt())
        for (i in left..right) {
            val row = (i / n).toInt()
            val col = (i % n).toInt()
            answer[(i - left).toInt()] = maxOf(row, col) + 1
        }
        return answer
    }
}

n=3이라고 했을때,
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
이런 행렬이 만들어 진다.각 값에는 i,j의 최대값에서 +1된 값이 들어갈거고, 해당부분은 (i / n),(i % n)를 이용해서 위치를 구할 수 있었다.

제한사항에 막혀 오랜시간 걸린 문제를 해결하니 뿌듯하며 힘들었다.... 그후 다른 사람들이 문제를 푼걸 보다가 깜짝 놀란 코드가 하나 있다..

import kotlin.math.max
class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        return (left..right).map { (max(it / n, it % n) + 1).toInt() }.toIntArray()
    }
}

코드를 읽으니 그대로 쭉 이해가 가고.. 아 짱이다 라는 소리가 나오는 코드였다.. 나도 이렇게 쉽게 풀고 넘어가보고싶다..

profile
이우진

2개의 댓글

comment-user-thumbnail
2023년 12월 1일

오늘도 고생하셨어요! 👍👍

답글 달기
comment-user-thumbnail
2023년 12월 1일

좋은 주말 보내세요~

답글 달기