Leetcode) Rotate image

Duna·2021년 8월 16일
0
post-thumbnail

Top Interview Questions
Easy Collection

Link of Problem

LEVEL : 🌕 🌕 🌑 🌑 🌑 (하)


Easy Collection의 열한번째 문제이자 Array 마지막 문제인 Rotate image를 풀어봤습니다.

Rotate image는 주어진 이차원배열 형식의 값들을 90도 회전시키는 문제였습니다.

문제 자체에 대한 접근은 쉬웠는데, 문제에서 조건으로 내걸었던 "다른 배열로 옮기지 말고 현재 배열에서 변경해라" 라는 말이 문제를 어떻게 풀어야 할 지 생각을 하게 만들었습니다.

같이 코드를 보면서 설명 진행해볼게요.

1️⃣ 번째 방법

일단 문제가 한 번에 풀렸습니다. 저번 스토쿠 문제가 저한테는 어려웠기 때문에 이번 문제도 당연 어려울 거라는 생각때문인지 고민을 많이 했습니다.
하지만 간단하게 이중 for문으로 풀이를 완료했어요. 다행입니다..🥲

문제 자체에서는 다른 배열로 옮기지 말라고 했지만, 저는 다른 배열로 옮기는 수 밖에는 생각이 안들어서 일단 배열 하나를 만들고 matrix에 있는 값들을 옮겨줬어요.

그리고 해당 배열에서 row를 하나씩 빼내오면서 row안의 값을 enumerated()를 사용해서 index와 함께 하나씩 빼줬습니다.
그러고나서 matrix의 맨 뒤 column부터 하나씩 채워갔어요.

어떤 방식을 사용했냐면 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]라고 했을 때,
90도로 돌린다면 matrix = [[7, 4, 1], [8, 5, 2], [9, 6, 3]]이 들어옵니다.
잘 생각해보면 각 배열의 맨 첫 번째 숫자들이 첫 번째 배열에 모이고, 두 번째 숫자들은 두 번째 배열, 세 번째 숫자들은 세 번째 배열에 모이는 걸 볼 수 있습니다.
그리고 순서는 뒤부터 들어오는 걸 볼 수 있어요.

해당 방식을 이용해서 첫 번째 배열 숫자들은 맨 마지막 열에 순서대로 배치하고, 중간 배열 숫자들은 중간 열에 순서대로 배치, 마지막 배열 숫자들은 첫 번째 열에 순서대로 배치했습니다.

func rotate(_ matrix: inout [[Int]]) {
    guard matrix.count != 1 else { return }
    let temp = matrix
    var column = matrix.count - 1
    
    for row in temp {
        for (index, i) in row.enumerated() {
            matrix[index][column] = i
        }
        column -= 1
    }
}

Runtime은 8ms로 괜찮게 나왔습니다!! 하지만 8ms보다 빠른 Runtime을 가진 코드가 있더라구요.

2️⃣ 번째 방법

이번 코드는 다른 배열을 추가하지 않고 해당 배열 안에서만 숫자 변경을 진행했습니다.
처음에 이런 방식을 생각하긴 했지만 어떻게 내가 원하는 숫자들끼리 변경하지 싶어서 시도해보지 않은 방식이었는데, 이렇게 하면 될 걸 싶었습니다.

일단 해당 코드는 두번의 이중 for문을 거쳐요. 그럼에도 빠른 이유는 matrix가 제일 커도 n이 20이라는 점과 배열을 하나만 사용하기 때문이 아닐까 싶습니다.

첫 번째 이중 for문은 각각 자기 자리와 상반되는 위치에 있는 숫자를 서로 바꿔줍니다.
처음에 이 코드를 보고 굳이 이렇게 왜 바꾸지 싶었습니다. 이해하고 보니, 해당 코드를 거치고 난 후에 우리가 원하는 숫자들끼리 한 배열에 묶여있게 된다는 걸 알게 됐습니다..!

두 번째 이중 for문은 이제 같은 배열에 있는 숫자들끼리 자리를 바꿔줍니다.
아마 위에 for문을 거치고 난 배열은 우리가 원하는 배열과는 완전히 반대로 생겼을 거예요. reversed()를 해주고 싶게 생겼습니다.
그 반대로 뒤집는 걸 두 번째 이중 for문이 해줄겁니다.

func rotate(_ matrix: inout [[Int]]) {
    let n = matrix.count
    
    for i in 0..<n {
        for j in i..<n {
            let temp  = matrix[i][j]
            matrix[i][j] = matrix[j][i]
            matrix[j][i] = temp
        }
    }
    
    for i in 0..<n {
        for j in 0..<n/2 {
            let temp  = matrix[i][j]
            matrix[i][j] = matrix[i][n - 1 - j]
            matrix[i][n - 1 - j] = temp
        }
    }
}

분명, 첫 번째 문제 풀 때 해당 코드보다 빠르다고 되어 있었는데 제가 돌려보니 더 느리게 나왔습니다.
8ms12ms나 큰 차이는 아니니깐요.!

profile
더 멋진 iOS 개발자를 향해

0개의 댓글