본문 바로가기

TEAM STUDY/알고리즘 코딩 테스트 스터디

8회차 - 배열 흔들기 (+)

728x90
반응형

8회차 - 배열 흔들기

 

 

8회차 - 배열 흔들기

 프로그래머 지수는 제비뽑기 프로그램을 만들고 있다. 자신이 이미 정해둔 N개의 배열에 각각 임의의 번호들을 저장해 두고 사용자들이 0~(N-1)의 정수 번호를 하나 입력하면 그 칸에 있는 숫

soobindeveloper8.tistory.com

 


배열 흔들기에 대해서 다시한번 이해하기

 

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 으로 해주기


잘 이해가 잘 가지 않았던 문제인데 다시한번 짚어보니 조~금은 이해가 가는 듯 하다.
처음 문제를 봤을 때 길이가 같은 임시 배열을 만든후 옮겨야 한다는 무식한 로직을 떠올렸는데
강의를 보고난 후에 머리를 쓰는 법을 조금씩 배워가는 중 ... 🚀

728x90
반응형

'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