나의 기록, 현진록

[Swift] 프로그래머스 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 행렬 테두리 회전하기 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 행렬 테두리 회전하기

guswlsdk 2022. 5. 19. 13:34
반응형

 

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

문제풀이

행렬 문제로 2차원 배열의 인덱스를 잘 고려하며 해결해야한다.

딱히 문제 풀이라고 할 것이 없고, 대신 고려할 점이 몇 가지 있다.

내가 문제를 풀면서 문제를 해결한 방법이다.

1. row <= 100, column <= 100이기 때문에 최댓값이 10000이라는 점이다.

min을 처음에 10000 이하의 수로 정의하여 테스트케이스를 통과하지 못 하였다.

 

2. 테스트 케이스에서 row, column이 같거나 큰 경우로 예를 들었는데 경우의 수는 세 가지이다.

- row > column

- row = column

- row < column 

이 세 가지의 경우를 만족하도록 유의하자.

 

 

 

코드

func solution(_ rows:Int, _ columns:Int, _ queries:[[Int]]) -> [Int] {
    
    var map = Array(repeating: Array(repeating: 0, count: columns+1), count: rows+1)
    var result = [Int]()
    for i in 1...rows{
        for j in 1...columns{
            map[i][j] = ((i-1) * columns + j)
        }
    }

    for query in queries{
        let x1 = query[0]
        let y1 = query[1]
        let x2 = query[2]
        let y2 = query[3]
        var i = x1
        var j = y1
        var min = 10000001
        var preVal = map[i][j]
        
        var plusFlag = true
        
        while true{
            let curVal = map[i][j]
            if min > curVal {
                min = curVal
            }
            map[i][j] = preVal
            preVal = curVal
            if plusFlag {
                if j < y2{
                    j += 1
                }else if i < x2{
                    i += 1
                }
            }else{
                if y1 < j {
                    j -= 1
                }else if x1 < i{
                    i -= 1
                }
            }
            if i == x2, j == y2 {
                plusFlag = false
            }
            if plusFlag == false, i == x1, j == y1{
                map[x1][y1] = preVal
                break
            }
        }
        result.append(min)
    }
    
    
    return result
}
반응형