Developing Myself Everyday
article thumbnail
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

다음은 6 x 6 크기 행렬의 예시입니다.

이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.

행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

나의 풀이

이 문제는 생각보다 단순한 프루트포스 문제이다. 문제를 어떻게 이해해서 풀려고 하기보다는 그냥 하나하나씩 해당하는 위치의 숫자를 배열에 담고, 그 위치에 배열에 있는 다음 숫자를 넣기만하면 되는 문제이다.

class Solution {
    fun solution(rows: Int, columns: Int, queries: Array<IntArray>): IntArray {
        var answer = mutableListOf<Int>()
        
        val array = Array(rows) { IntArray(columns) }
        
        var index = 1
        
        for (i in 0 until rows) {
            for (j in 0 until columns) {
                array[i][j] = index++
            }
        }
               
        // 일단 각 자리에 있는 숫자들을 순서대로 뺌. 그리고 min을 구함
        queries.forEach {
            val queue = ArrayDeque<Int>()
            val (x1, y1, x2, y2) = it.map { it.toInt() - 1 }
            //   2   2    5   4
            
            // 첫번째는 2 2 부터 2 3까지 (x1, y1)  (x1, y2 - 1) 
            for (i in y1..y2 - 1) {
                queue.add(array[x1][i])
            }     
            
            // 두번쨰는 2 4 부터 4 4까지 (x1, y2) (x2 - 1, y2)
            for (i in x1..x2 - 1) {
                queue.add(array[i][y2])
            }
            
            // 세번쨰는 5 4 부터 5 3까지 (x2, y2) (x2, y1 + 1)
            for (i in y2 downTo y1 + 1) {
                queue.add(array[x2][i])
            }
            
            // 마지막은 5 2부터 3 2까지 (x2, y1) (x1 + 1, y1)
            for (i in x2 downTo x1 + 1) {
                queue.add(array[i][y1])
            }
            
            // 그 다음 마지막 숫자를 빼고 첫번째에 넣은 다음 앞에서 부터 빼면서 처음에 뺏던 자리에 그대로 넣음
            
            answer.add(queue.minOrNull() ?: 0)
            
            queue.addFirst(queue.removeLast())
            
            for (i in y1..y2 - 1) {
                array[x1][i] = queue.removeFirst()
            }     
            
            // 두번쨰는 2 4 부터 4 4까지 (x1, y2) (x2 - 1, y2)
            for (i in x1..x2 - 1) {
                array[i][y2] = queue.removeFirst()
            }
            
            // 세번쨰는 5 4 부터 5 3까지 (x2, y2) (x2, y1 + 1)
            for (i in y2 downTo y1 + 1) {
                array[x2][i] = queue.removeFirst()
            }
            
            // 마지막은 5 2부터 3 2까지 (x2, y1) (x1 + 1, y1)
            for (i in x2 downTo x1 + 1) {
                array[i][y1] = queue.removeFirst()
            }

        }

        return answer.toIntArray()
    }
}

'프로그래머스 - kotlin > LEVEL 2' 카테고리의 다른 글

거리두기 확인하기 - Kotlin  (0) 2023.03.03
택배 상자 - Kotlin  (0) 2023.02.24
롤케이크 자르기 - Kotlin  (0) 2023.02.22
두 큐 합 같게 만들기 - Kotlin  (0) 2023.02.10
H-Index  (0) 2022.12.08
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!