문제 설명
직사각형 모양의 행렬이 있고, 모든 행이 한 칸씩 아래쪽으로 이동하는 ShiftRow 연산과 바깥쪽 원소들이 시계 방향으로 한 칸씩 이동하는 Rotate 연산이 있습니다.
주어진 연산들을 모두 수행한 뒤의 행렬 상태를 반환합니다.
제한사항
- 2 ≤ rc의 행 길이(=행렬의 가로 길이) ≤ 50,000
- rc의 모든 행의 길이는 동일합니다.
- 2 ≤ rc의 열 길이(=행렬의 세로 길이) ≤ 50,000
- rc의 모든 열의 길이는 동일합니다.
- 4 ≤ rc의 행 길이 x rc의 열 길이 ≤ 100,000
- rc[i][j] 는 i+1번째 행 j+1번째 열에 있는 원소를 나타냅니다.
- 1 ≤ rc[i][j] ≤ 1,000,000
- 1 ≤ operations의 길이 ≤ 100,000
- operations의 원소는 "ShiftRow" 혹은 "Rotate"입니다.
풀이
카카오 공식 블로그(링크)의 풀이를 참고했습니다.
첫 번째 풀이
아이디어
문제 그대로 연산을 구현한다면 ShiftRow 연산은 모든 원소를 움직여야 하기 때문에 N(행 수) * M(열 수) * Q(연산 수) 의 시간이 소요됩니다.
행렬의 행(N), 열(M) 길이의 최댓값은 각각 50,000 이하이고 연산의 최대 개수(Q)는 100,000 이기 때문에 효율성 테스트 케이스를 통과할 수 없습니다.
위 그림과 같이 행렬의 원소들을 행별로, 가장자리 원소들별로 관리한다면 두 연산의 시간복잡도는 다음과 같습니다.
ShiftRow 연산은 마지막(가장 아래) 행을 통째로 처음(가장 위)으로 옮기기 때문에 O(1)의 시간이 소요되고,
Rotate 연산은 바깥쪽 열 2줄과 행 2줄의 원소들 각각 1개씩만을 옮기기 때문에 역시 O(1)의 시간이 소요됩니다.
코드 (Python)
결과 (Python)
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 60063 - 블록 이동하기 (Python) (1) | 2022.09.13 |
---|---|
[프로그래머스] 118669 - 등산코스 정하기 (Python) (3) | 2022.08.19 |
[프로그래머스] 92343 - 양과 늑대 (Java) (0) | 2022.07.13 |
[프로그래머스] 43238 - 입국심사 (Java, Python) (0) | 2022.07.13 |
댓글