프로그래머스

[프로그래머스][2022 KAKAO TECH INTERNSHIP][Kotlin] 행렬과 연산

끝까지 처음처럼 2023. 2. 14. 13:35
728x90
import java.util.*

class Solution {
    fun solution(rc: Array<IntArray>, operations: Array<String>): Array<IntArray> {
        var answer: Array<IntArray> = rc
        var Left = ArrayDeque<Int>()
        var Mid = ArrayDeque<ArrayDeque<Int>>()
        var Right = ArrayDeque<Int>()

        //데이터 입력
        for(i in 0 .. rc.size-1){
            var temp = ArrayDeque<Int>()
            for(j in 0 .. rc[i].size-1){
               if(j == 0) Left.add(rc[i][j])
               else if(j == rc[i].size-1) Right.add(rc[i][j])
               else temp.add(rc[i][j])
            }
            Mid.add(temp)
        }

        operations.forEach {
            if(it == "Rotate"){
                Mid.peekFirst().addFirst(Left.pollFirst());
                Right.addFirst(Mid.peekFirst().pollLast());
                Mid.peekLast().addLast(Right.pollLast());
                Left.addLast(Mid.peekLast().pollFirst());

            } else {
                Left.addFirst(Left.pollLast());
                Mid.addFirst(Mid.pollLast());
                Right.addFirst(Right.pollLast());
            }
        }


        for(i in 0 .. rc.size-1){
            var j = 0
            answer[i][0] = Left.pollFirst()
            j++
            var temp = Mid.pollFirst()
            while(!temp.isEmpty()){
                answer[i][j++] = temp.pollFirst()
            }
            answer[i][j] = Right.pollFirst()
        }


        return answer
    }
}

해당 문제는 Deque를 사용하여 풀 수 있는 문제 였습니다.

저도 처음에는 공부가 부족하여 MutableList를 사용하여 코드를 작성 하였었으나 효율성에서 모두 시간초과가

발생하여 당혹스러웠던 적이 있었습니다.

코드의 주요 포인트는 그림을 빌려 표현하자면 각 행마다 첫번째 값을 Left 가운데 있는 값들을 Mid 끝에 있는 값들을 Right의 Deque 및 Deque<Deque> 로 저장하여 입력되는 operations 의 값에 따라 변형을 시켜 최종 정답을 알아내는 것 입니다.

하기는 상기 코드의 실행 결과 입니다.

테스트 1 통과 (0.10ms, 60.4MB)
테스트 2 통과 (0.71ms, 58.6MB)
테스트 3 통과 (0.50ms, 62.1MB)
테스트 4 통과 (0.57ms, 59.1MB)
테스트 5 통과 (4.06ms, 69.1MB)
테스트 6 통과 (4.98ms, 69.2MB)
테스트 7 통과 (3.64ms, 65.6MB)
테스트 8 통과 (2.56ms, 65.5MB)
테스트 9 통과 (3.18ms, 67.1MB)
테스트 10 통과 (2.97ms, 65.9MB)
효율성 테스트
테스트 1 통과 (41.89ms, 101MB)
테스트 2 통과 (43.30ms, 101MB)
테스트 3 통과 (37.90ms, 99.8MB)
테스트 4 통과 (68.75ms, 115MB)
테스트 5 통과 (78.89ms, 113MB)
테스트 6 통과 (71.29ms, 116MB)
테스트 7 통과 (56.81ms, 97.7MB)
테스트 8 통과 (53.35ms, 99.7MB)
테스트 9 통과 (60.69ms, 97.4MB)