#include  memmove(A, B, 크기) 
→ 배열의 크기만큼 B를 A로 복사 (배열 복사할 때 유용한 함수) 
2차원 배열 회전 공식 
좌상단 (a, b) 
우하단 (c, d) 
c-a == d-b를 만족해야 함 
- 시계방향 90도: rotated[ i ][ j ] = origin[ a + (d - j) ][ b + (i - a) ] 
- 반시계방향 90도: rotated[ i ][ j ] = origin[ a + (j - b) ][ d - (i - a) ] 
- (A + B) % C = ((A % C) + (B % C)) % C 
- (A - B) % C = ((A % C) - (B % C) + C) % C 
- (A * B) % C = ((A % C) * (B % C)) % C 
계산이 누적되는 경우 중간중간 적용 
ios::sync_with_stdio(false); 
cin.tie(NULL); 
cout.tie(NULL); 
string number; 
int num = number[i] - '0'; 
struct comp {
bool operator()(int a, int b){ return a > b; }
}; → 우선순위 큐의 정렬기준
priority_queue <int, vector, comp> pq; → 정렬기준을 추가하여 최소힙 선언
우선순위 큐의 정렬기준은 struct의 bool operator 사용 
위의 예시는 최소힙, 오름차순 
bool operator의 return은 두 값 중 어떤 값이 더 우선순위가 낮은지를 반환해야 함 
(true가 우선순위가 낮음, 정렬할 때 뒤로 감) 
- sort: bool 함수 이용 | 어느 값이 더 작아야 하는가 | 디폴트 오름차순
- priority queue: struct의 bool operator()(input) 이용 | 어느 값이 우선순위가 더 낮은가 | 디폴트 내림차순 (최대힙)
sort는 true가 그대로 적용, priority queue는 true가 뒤로 밀림 (우선순위 낮음, 반대로 적용된다고 생각)
1차원의 index를 2차원 값으로 변환 (M은 열의 개수(columns))
- row = index / M
- col = index % M
2차원 값을 1차원 index로 변환 (M은 열의 개수(columns))
- index = (row * M) + col