Simple&Natural

배열 회전하기 본문

코딩테스트 풀이/그외

배열 회전하기

Essense 2020. 8. 27. 01:21
728x90

원리는 매우 간단한데 직접 그림을 그려보면 더욱 이해가 쉽다.

90도 회전은 위아래를 대칭시킨 뒤 주 대각선에 대해 대칭시킨 형태이다.

대각선에 대해 먼저 대칭을 시켜도 된다.

여기서 주 대각선이란 배열의 행과 열이 같은 라인을 의미한다.

 

아래의 그림은 2차원 배열을 보기 쉽게 도식화한 것이다.

색이 칠해진 부분을 1, 빈 칸을 0 으로 보면

[[0, 1, 0], [1, 1, 0], [0, 0, 1]] 형태의 2차원 배열이 된다.

이 배열을 위에서부터 쌓아내렸을 경우와 아래에서부터 쌓아 올렸을 경우 두 가지로 생각해보자.

(사실 별 차이는 없다) 

 

1번은 위에서 아래로 쌓는 배열, 2번은 아래에서 위로 쌓는 배열이다.

 

reverse를 이용하면 배열의 행이 역순이 되므로 위아래가 바뀌고

i, j 대신 j, i를 대입해주면 배열의 행과 열이 바뀌게 되므로 대각선에 대한 대칭이 된다.

 

위에서 아래로 쌓는 배열의 경우 대각선은 y=-x 형태가,

아래에서 위로 쌓는 배열의 경우 y=x 형태의 대각선이 기준선이 될 것이다.

 

이유는 앞서 말했듯이 배열의 행과 열이 같아지는 원소들의 집합이 1번의 경우 y=-x, 2번의 경우 y=x 선 상에 있기 때문이다.

 

 

2차원 배열을 시계방향으로 90도 회전하는 소스코드

 

fun rotateArray(arr: Array<IntArray>): Array<IntArray> {
    return Array(arr.size) { i ->
        IntArray(arr.size) { j ->
            arr.reversedArray()[j][i]
        }
    }
}

 

비슷한 방법으로 시계 반대방향으로도 줄 수 있다.

728x90

'코딩테스트 풀이 > 그외' 카테고리의 다른 글

행렬의 곱셈 구현  (0) 2020.04.06