🗃️javascript/프로그래머스

공 던지기(Lv.0)[좀 더 답에만 집중한 순서도를 설계하자]

하얀성 2023. 3. 11. 11:30
<문제 설명>

 

머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 2 < numbers의 길이 < 100
  • 0 < k < 1,000
  • numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
  • numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.

입출력 예numberskresult
[1, 2, 3, 4] 2 3
[1, 2, 3, 4, 5, 6] 5 3
[1, 2, 3] 3 2

입출력 예 설명

입출력 예 #1

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 1번에게 공을 던집니다.

입출력 예 #2

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 5번에게 공을 던집니다.
  • 5번은 세 번째로 1번에게 공을 던집니다.
  • 1번은 네 번째로 3번에게 공을 던집니다.
  • 3번은 다섯 번째로 5번에게 공을 던집니다.

입출력 예 #3

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 2번에게 공을 던집니다.
  • 2번은 세 번째로 1번에게 공을 던집니다.

※ 공지 - 2023년 1월 25일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.


<설계>

+2씩 증가

numbers[0]에서 시작 k만큼 계속 2 더해줌

마지막 전, 마지막 사람은 각각 0번째 , 1번째 요소에 공을 줘야함. 

if(마지막 전, 마지막 요소일 경우)
arr1.push()


배열길이 - 마지막 전 요소 위치 = 0
4 - 2 - 2 = 0 
6 - 4 - 2 = 0

0 1 2(배열의 최소 길이는 3) 
3 - 1 - 2  = 0 

0 2 1 0 2 1 

5 - 3 - 2  = 0
7 - 5 - 2  = 0

배열길이 - 마지막 요소 위치 = 1
3 - 2 = 1
0 1 2 3 4 5 

6 - 5 = 1
k는 arr1 배열 길이 갯수로 구해야 겟는걸?

 

<작성 답안>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function solution(numbers, k) {
    let arr1 = [];
    let more = 0;
    for(let i=0; i<=k; i++){
        // 공 만져본 사람 수(맨 첫사람도 포함해서 0순번이 1번째 사람.)
        
        arr1.push(numbers[0]+i*2) // 2씩 증가
        console.log(arr1)
        if(i*2 == numbers.length-2){
        // 마지막 전 사람일 경우 앞으로 순회시키기(0에서 시작)
           k = 2
        
        }else if(numbers.length-1 == 2*i){
            // 1에서 다시 시작
            arr1.push(8)
        }
    
    }
    
}
cs

아래처럼 다시 맨 처음 칸으로 되돌리는게 안된다.

력값 [1, 2, 3, 4], 2
기댓값 3
실행 결과 실행한 결괏값 undefined가 기댓값 3과 다릅니다.
출력 [ 1 ]
[ 1, 3 ]
[ 1, 3, 5 ]
테스트 2
입력값 [1, 2, 3, 4, 5, 6], 5
기댓값 3
실행 결과 실행한 결괏값 undefined가 기댓값 3과 다릅니다.
출력 [ 1 ]
[ 1, 3 ]
[ 1, 3, 5 ]
테스트 3
입력값 [1, 2, 3], 3
기댓값 2
실행 결과 실행한 결괏값 undefined가 기댓값 2과 다릅니다.
출력 [ 1 ]
[ 1, 3 ]
[ 1, 3, 8, 5 ]
[ 1, 3, 8, 5, 7 ]

<정답>

function solution(numbers, k) {
return numbers[(k - 1) * 2 % numbers.length];
}

//x번째로 던져진 지점이 아니라 던진 사람이기 때문에 k - 1을 해주고, 한 사람씩 건너뛰므로 2를 곱해준 값을 배열의 크기로 나눈 index

 


후기

 

그저 배열의 위치만을 구하면 되는 문제여서 어떻게 하면 배열의 위치값을 움직여서 값을 구할 지 다들 연구했더라.

나도 내가 원하는 방식말고, 좀 더 결과만 가볍게 구해낼 수 있도록 설계를 더 고민해봐야겠다.