2023.07.14.금.TIL

heeh·2023년 7월 16일

TIL

목록 보기
43/82
post-thumbnail

2023.07.14.금

  • Added dependencies
    • Spring Web
    • Thymeleaf
    • Spring Security
    • Spring Data JPA
    • MySQL Driver
    • Lombok
    • Validation

페어프로그래밍

class Solution {
        public int solution(int[] numbers, int k) {
            int answer = 0;

            for (int i = 0; ; i += 2) {
                // i는 공을 던지는 사람의 인덱스
                // i는 0으로 초기화
                // 반복할 때 마다 2씩 증가 = 오른쪽으로 한명을 건너 뛰어 던지는 사람

                if (k > 0) { // k 가 0보다 크다면

                    answer = numbers[i % numbers.length]; // 선택한 사람의 인덱스를 구하기
                    // i를 numbers 배열의 길이로 나눈 나머지를 구하면, i가 배열의 길이를 넘어가더라도 순환하면서 선택한 사람의 인덱스를 계산
                    // i가 2고 numbers.length가 3일 때 2/3 = 1
                    // i가 2이고 numbers.length가 4일 때 2/4 = 2

                    k--;
                    // k를 1씩 감소시키면서 반복문을 실행하면서, k가 0이 되는 순간에 answer에 저장된 사람의 번호가 k번째로 공을 던지는 사람의 번호가 됨
                    // 반복문 내에서 k를 감소시키기 전에 answer에 해당 사람의 번호를 할당하고 있으므로,
                    // 0보다 큰 동안 반복문이 실행되고 k--를 통해 k 값을 감소하고 k번째로 공을 던질 사람의 번호를 찾음
                } else {
                    break;
                }
            }

            return answer;
        }
    }
  • 도움 해설
    • i가 2이고 numbers.length가 4일 때? i가 2이고 numbers.length가 4인 경우를 그림으로 설명해드리겠습니다. 친구들이 동그랗게 서 있는 상황에서 numbers.length가 4이므로 친구들은 0번부터 3번까지 번호가 매겨져 있습니다. 여기서 i가 2라고 가정해봅시다.
      1. 초기 상태:

        Copy code
        0   1   2   3
        ^   ^   o
        

        현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.

      2. 오른쪽으로 한 명 건너뛴 상태:

        Copy code
        0   1   2   3
        ^       ^   o
        

        현재 공을 받을 차례인 사람은 0번입니다. 공은 0번 사람에게 던져집니다.

      3. 오른쪽으로 한 명 건너뛴 상태:

        markdownCopy code
        0   1   2   3
                ^   o
        

        현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.

      4. 오른쪽으로 한 명 건너뛴 상태:

        Copy code
        0   1   2   3
        ^   o
        

        현재 공을 받을 차례인 사람은 1번입니다. 공은 1번 사람에게 던져집니다.

      5. 오른쪽으로 한 명 건너뛴 상태:

        ```
        Copy code
        0   1   2   3
        o
        
        ```
        
        현재 공을 받을 차례인 사람은 **`3`**번입니다. 공은 **`3`**번 사람에게 던져집니다.

        따라서 i가 2이고 numbers.length가 4일 때, numbers[2]2번 사람이 선택되어 공을 받습니다.

    • i가 2이고 numbers.length가 3일 때? i가 2이고 numbers.length가 3인 경우를 그림으로 설명해드리겠습니다. 친구들이 동그랗게 서 있는 상황에서 numbers.length가 3이므로 친구들은 0번부터 2번까지 번호가 매겨져 있습니다. 여기서 i가 2라고 가정해봅시다.
      1. 초기 상태:

        Copy code
        0   1   2
        ^   ^   o
        

        현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.

      2. 오른쪽으로 한 명 건너뛴 상태:

        Copy code
        0   1   2
        ^       o
        

        현재 공을 받을 차례인 사람은 1번입니다. 공은 1번 사람에게 던져집니다.

      3. 오른쪽으로 한 명 건너뛴 상태:

        Copy code
        0   1   2
        o
        

        현재 공을 받을 차례인 사람은 0번입니다. 공은 0번 사람에게 던져집니다.

      4. 오른쪽으로 한 명 건너뛴 상태:

        Copy code
        0   1   2
        ^
        

        현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.

      5. 오른쪽으로 한 명 건너뛴 상태:

        ```
        markdownCopy code
        0   1   2
            ^
        
        ```
        
        현재 공을 받을 차례인 사람은 **`1`**번입니다. 공은 **`1`**번 사람에게 던져집니다.

        계속해서 사람들을 순환하면서 오른쪽으로 한 명씩 건너뛰며 공을 던지게 됩니다.

        따라서 i가 2이고 numbers.length가 3일 때, numbers[2]2번 사람이 선택되어 공을 받습니다.

  • 왜 k—를 해주나요?
    • k--를 사용하는 이유는 주어진 문제에서 k번째로 공을 던지는 사람의 번호를 찾기 위해서
    • 반복문 내에서 k의 값을 감소시키는 이유는 반복문이 실행될 때마다 k번째로 공을 던질 사람의 번호를 찾기 위해서
    • k를 1씩 감소시키면서 반복문을 실행하면서, k가 0이 되는 순간에 answer에 저장된 사람의 번호가 k번째로 공을 던지는 사람의 번호가 됨
    • 반복문 내에서 k를 감소시키기 전에 answer에 해당 사람의 번호를 할당하고 있으므로, k값이 0보다 큰 동안 반복문이 실행되고 k--를 통해 k 값을 감소시킴
    • 이렇게 하면 k번째로 공을 던질 사람의 번호를 찾을 수 있음
    • k--를 해줌으로써 반복문을 통해 k번째로 공을 던지는 사람의 번호를 찾을 수 있는 로직을 구현할 수 있음
  • k--가 없으면?
    • k--가 없는 경우, 즉 k 값을 감소시키지 않는다면 반복문이 무한히 실행되어 종료되지 않는 상황이 발생
    • k를 감소시키지 않는다면 k의 값은 변하지 않고 계속해서 초기값을 유지
    • k가 0보다 큰 조건을 항상 만족하게 되어 반복문이 무한히 실행
    • ex k의 초기값이 3이고 numbers.length가 5인 경우
      • 반복문이 실행될 때마다 k를 감소시키지 않는다면 항상 k 값이 3인 상태로 반복문이 실행
      • 조건문 if (k > 0)는 항상 참이 되어 반복문이 무한히 실행
      • k 값을 감소시켜주는 k--가 없다면 반복문이 무한루프에 빠지게 되므로, k번째로 공을 던지는 사람을 찾을 수 없음
profile
공부하자개발하자으쌰으쌰

0개의 댓글