기록하는 공부

[Programmers] 120843 공 던지기 본문

Language/Java

[Programmers] 120843 공 던지기

SS_StudySteadily 2023. 8. 2. 23:09
728x90
반응형

 

 

문제출처

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120843

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 


 

 

문제 풀이

 

 

import java.util.*;

class Solution {
    public int solution(int[] numbers, int k) {
        
        int num = 2*k;  //배열 크기의 최소 필요 값
        int arr_len = numbers.length;	//입력받은 배열의 길이
        
        while(arr_len < num) {	//배열의 길이가 num보다 작으면
            arr_len += arr_len;	//배열의 길이 늘리기
        }
        
        int[] num_arr = new int[arr_len];	//늘어난 길이만큼의 새 배열 생성
        
        for(int i=0; i<arr_len; i++) {		//0부터 늘어난 길이만큼 반복
            num_arr[i] = numbers[i % numbers.length];	//새 배열의 0~끝 인덱스에 numbers의 배열 인덱스가 [i%numbers.length]인 값을 대입
        }
        
        int answer = num_arr[num-2];	//새 배열의 길이에서 2를 뺌
        
        return answer;
    }
}

 

 

먼저, num 변수에 k의 두 배 값을 저장한다. 이는 문제에서 한 명을 건너뛰고 다음 사람에게 공을 던지는데 이렇게 했을 때, 필요한 요소의 길이의 최솟값을 구하기 위해서이다.

 

그리고 arr_len에는 인자로 받은 numbers의 배열의 길이를 저장한다.

 

다음 while문에서 arr_len이 num보다 작을 경우, 배열의 길이를 두 배로 늘린다. 왜냐하면, k번째로 공을 던지는 사람을 구하기 위해서 최소 배열의 길이 값인 num만큼의 길이가 필요하여 늘려야 하기 때문이다.

 

num_arr이라는 늘어난 길이만큼의 새로운 배열을 생성한다. 이 배열을 이용하여 k번째로 공을 던지는 사람을 찾을 수 있다.

 

for문에서 0부터 늘어난 길이인 arr_len까지 반복을 한다.

num_arr[i] = numbers[i%numbers.length] 을 사용해 numbers의 배열을 반복적으로 새 배열의 채운다.

나머지 값을 대입하여 계산해보면 이해가 쉽다.

 

예를 들어, numbers=[1, 2, 3, 4, 5, 6]이고 k가 5인 경우를 생각해 보자.

5번째로 공을 던지는 사람을 찾으려면 배열의 길이를 최소 12개[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]까지는 늘려야지 찾을 수 있다.

1 -> 3 -> 5 -> 1 -> 3 이 돼야 하기 때문에 배열을 한번 더 복사해야 한다.

 

i가 0일 때 배열의 길이는 6이므로 나머지 연산의 결과는 0

따라서, 새 배열인 num_arr 인덱스 0에 numbers[0]의 값을 대입한다.

 

i가 1일 때 배열의 길이는 6이므로 나머지 연산의 결과는 1

num_arr[1] = numbers[1]의 값 대입이 된다.

 

이런 식으로 num_arr 배열을 numbers의 배열의 값으로 반복적으로 채울 수 있다.

 

그리고 이제 k번째로 던지는 사람을 찾기 위해서 num에서 2를 빼준 인덱스 값을 반환하면 해결할 수 있다.

 

 

 

 

리뷰

 

 

사실 나는 이 문제가 어려웠다...ㅜㅜ 머리로는 이해가 가는데 코드로 구현하려니 생각도 잘 안 나고 답답함의 연속이었다. 하지만 친한 선배의 도움으로 이해하고 코드도 짜보면서 해결할 수 있었다.

(강낭콩씨 감사합니다 ㅜ_ㅜ)

이제 레벨 0의 문제들을 해결하고 있는데 막히니 자괴감도 많이 들고 더 열심히 해야겠다는 다짐을 할 수 있었다.

앞으로 정신 바짝 차리고 나태해지지 않고 꾸준히 공부해야겠다! 파이팅!!

728x90
반응형