프로그래머스
[프로그래머스][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) |