반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- @P0
- 백준
- 기술면접
- 퇴사통보
- softeer
- dfs
- 오퍼레터
- Docker
- 성적평가
- 파라메트릭
- msSQL
- 이분탐색
- 물채우기
- 매개변수탐색
- 13908
- 처우산정
- 백트래킹
- compose
- OFFSET
- incr
- 소프티어
- boj #19237 #어른 상어
- 연결요소
- Kafka
- upper_bound
- 경력
- BOJ
- 처우협의
- 6987
Archives
- Today
- Total
기술 블로그
N by N 행렬을 시계 방향 90도 회전 본문
728x90
반응형
추가적인 행렬(배열) 없이 90도 회전 시키는 알고리즘
같은 색의 모든 칸을 다른 색의 모든 칸으로 한 번에 옮기는 것이 아님.
빨간색은 임의의 변수(int)에 저장
빨간색에 보라색 저장
보라색에 노란색 저장
노란색에 하늘색 저장
하늘색에 빨간색(임의의 변수에 저장한 값) 저장
자세한 진행 순서는 아래 Tip 참고.
Tip
행렬 회전에서는 인덱스의 활용이 중요하다. [행][열]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] [3][0] [3][1] [3][2] [3][3] Top = [0][0] [0][0] = [3][0] [3][0] = [3][3] [3][3] = [0][3] [0][3] = Top Top = [0][1] [0][1] = [2][0] [2][0] = [3][2] [3][2] = [1][3] [1][3] = Top . . . | cs |
예를 들어,
7, 13 번 째 줄
→ [a][b] = [c][d]에서 b + c는 N - 1로 일정.(배열 시작을 0부터 시작할 경우) 그래서 b가 j 일 경우, c는 MAX - 1 - j이다.
그리고 a와 d는 같다.
8, 14 번 째 줄
→ [a][b] = [c][d]에서 b + c는 N - 1로 일정.(배열 시작을 0부터 시작할 경우) 그래서 b가 i 일 경우, c는 MAX - 1 - i이다.
.
.
.
출력 화면 결과
1 2 3 4 5 6 7 8 9 10 11 12 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 21 16 11 6 1 22 17 12 7 2 23 18 13 8 3 24 19 14 9 4 25 20 15 10 5 | cs |
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <iostream> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> #include <map> #include <set> #include <sstream> #include <tuple> #pragma warning(disable:4996) #pragma comment(linker, "/STACK:336777216") using namespace std; #define MAX 5 int arr[MAX][MAX] = { 0, }; void rotate() { for (int i = 0; i < MAX / 2; i++) for (int j = i; j < MAX - 1 - i; j++) { int Top = arr[i][j]; // Top ← 위쪽 arr[i][j] = arr[MAX - 1 - j][i]; // 위쪽 ← 왼쪽 arr[MAX - 1 - j][i] = arr[MAX - 1 - i][MAX - 1 - j]; // 왼쪽 ← 아래쪽 arr[MAX - 1 - i][MAX - 1 - j] = arr[j][MAX - 1 - i]; // 아래쪽 ← 오른쪽 arr[j][MAX - 1 - i] = Top; // 오른쪽 ← Top(위쪽) } } void print() { printf("\n\n"); for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX; j++) printf("%2d ", arr[i][j]); printf("\n"); } } int main(void) { int n = 1; for (int i = 0; i < MAX; i++) for (int j = 0; j < MAX; j++) arr[i][j] = n++; print(); rotate(); print(); return 0; } | cs |
728x90
반응형
'알고리즘 > 면접 및 공부' 카테고리의 다른 글
선분 교차 판별 및 CCW (0) | 2019.08.15 |
---|---|
연속합 (0) | 2019.05.01 |
단방향 연결리스트가 있을 때, 맨 뒤에서 k번 째 원소 구하기 (0) | 2019.04.21 |
정렬되어 있지 않은 연결리스트에서 임시 버퍼 없이 중복되는 원소 제거 (0) | 2019.04.21 |
숫자 교환 (0) | 2019.04.19 |