배열 흔들기에 대해서 다시한번 이해하기
nNumbers 에 배열의 원소의 수를 저장한다.
nCommands에는 처리할 명령어의 수를 저장한다.
ShiftingArray 객체에 index 와 value 를 입력 받아 저장할 예정이다.
ShiftingArray .set => 현재 배열에서 'index'번째에 존재하는 원소를 'value'로 변경하는 함수
ShiftingArray .set 을 이용해 배열 값을 저장한다.
public void set(int index, T value) {
int realIndex = (index + leftIndex);
array[realIndex] = value;
}
leftIndex는 배열의 첫번째 위치를 가르키는 역할을 하는데,
결국 index + leftIndex 값을 ShiftingArray .array 에 저장한다.
배열을 흔들고 확인하는 방법은 4가지가 있다.
- 0
- 현재 배열에 p번 인덱스에 있는 원소를 출력하는 명령
- 1
- 현재 배열을 왼쪽으로 k번 shift하는 명령
- 2
- 현재 배열을 오른쪽으로 k번 shift하는 명령
- 3
- 현재 배열을 최초의 위치로 복원하는 명령
0번 - 현재 배열에 p번 인덱스에 있는 원소를 출력하는 명령
ShiftingArray .array 에 인덱스번째에 있는 값을 가지고 온다
public T get(int index) {
int realIndex = (index + leftIndex);
return array[realIndex];
}
1번 - 현재 배열을 왼쪽으로 k번 shift하는 명령
개인적으로 이 함수가 이 알고리즘의 핵심이라고 생각한다.
public void shiftLeft(int times){
times = times % length;
leftIndex = (leftIndex + times) % length;
}
예를들어 5개의 길이를 가진 배열이라고 생각했을 때, 아래와 같은 값이 있다고 치자
leftIndex | * | ||||
index | 0 | 1 | 2 | 3 | 4 |
value | 1 | 2 | 3 | 4 | 5 |
왼쪽으로 7번 옮기려 했을 때 내가 바라는 결과는 아래와 같다.
최초값 | 1 | 2 | 3 | 4 | 5 |
1번 옮겼을 때 값 | 5 | 1 | 2 | 3 | 4 |
2번 옮겼을 때 값 | 4 | 5 | 1 | 2 | 3 |
3번 옮겼을 때 값 | 3 | 4 | 5 | 1 | 2 |
4번 옮겼을 때 값 | 2 | 3 | 4 | 5 | 1 |
5번 옮겼을 때 값 | 1 | 2 | 3 | 4 | 5 |
6번 옮겼을 때 값 | 5 | 1 | 2 | 3 | 4 |
7번 옮겼을 때 값 | 4 | 5 | 1 | 2 | 3 |
times 는 7일 것이고
times = times % length;
times = 7 % 5; == > 즉 times 에는 2가 들어갈 것이다.
( 1 + 2 ) / 5 = 3
배열을 흔든 뒤에는 아래와 같은 상태를 이룬다.
즉 배열은 변화가 없지만 배열의 첫번째 요소를 가르키는 포인트역할을 하는 leftIndex 가 변화한 것이다.
leftIndex | * | ||||
index | 0 | 1 | 2 | 3 | 4 |
value | 1 | 2 | 3 | 4 | 5 |
2번 - 현재 배열을 오른쪽으로 k번 shift하는 명령
1번과 비슷한 로직이다.
public void shiftRight(int times){
times = times % length;
leftIndex = (leftIndex - times + length) % length;
}
leftIndex | * | ||||
index | 0 | 1 | 2 | 3 | 4 |
value | 1 | 2 | 3 | 4 | 5 |
오른쪽으로 세번 옮기려 할 때 내가 바라는 결과는 아래와 같다.
최초값 | 1 | 2 | 3 | 4 | 5 |
1번 옮겼을 때 값 | 5 | 1 | 2 | 3 | 4 |
2번 옮겼을 때 값 | 4 | 5 | 1 | 2 | 3 |
3번 옮겼을 때 값 | 3 | 4 | 5 | 1 | 2 |
3 % 5 는 3이다.
( 0 - 3 + 5 ) % 5 = 2 이다.
leftIndex | * | ||||
index | 0 | 1 | 2 | 3 | 4 |
value | 1 | 2 | 3 | 4 | 5 |
3번 - 현재 배열을 리셋
leftIndex = 0 으로 해주기
잘 이해가 잘 가지 않았던 문제인데 다시한번 짚어보니 조~금은 이해가 가는 듯 하다.
처음 문제를 봤을 때 길이가 같은 임시 배열을 만든후 옮겨야 한다는 무식한 로직을 떠올렸는데
강의를 보고난 후에 머리를 쓰는 법을 조금씩 배워가는 중 ... 🚀
'TEAM STUDY > 알고리즘 코딩 테스트 스터디' 카테고리의 다른 글
9회차 - 괄호 문자열 (0) | 2022.08.06 |
---|---|
7회차 - 수열의 순환 (+) (0) | 2022.08.01 |
8회차 - 공약수 게임 (0) | 2022.07.23 |
8회차 - 골드바흐의 추측 (0) | 2022.07.23 |
8회차 - 카잉 달력 (0) | 2022.07.23 |