Javascript/문제 풀이

프로그래머스 14일차

아라라_ 2023. 5. 30. 22:48

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

Frederick Philips Brooks
Mythical Man-Month 저자
728x90

공 던지기

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

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

배열 인덱스는 0부터 시작하므로 k - 1을 해줍니다. 이를 통해 k번째 공을 던지는 사람의 인덱스를 구합니다.

그 다음, 2를 곱하고 numbers.length로 나눈 나머지 값을 계산합니다. 이를 통해 순환적인 인덱스 접근을 구현합니다.

만약 numbers 배열의 길이가 5라고 가정해보겠습니다. k가 1일 때, (1 - 1) * 2 % 5는 0이 됩니다. 따라서 첫 번째 공을 던지는 사람의 인덱스인 0이 반환됩니다.

만약 k가 2일 때, (2 - 1) * 2 % 5는 2가 됩니다. 따라서 세 번째 공을 던지는 사람의 인덱스인 2가 반환됩니다.

이런 식으로 k가 증가할 때마다 2씩 곱하고 배열 길이로 나눈 나머지를 계산하면, 주어진 배열에서 순환적으로 사람을 선택할 수 있습니다.

따라서 최종적으로 (k - 1) * 2 % numbers.length를 통해 k번째로 공을 던지는 사람의 번호를 반환합니다.

 

 

배열 회전시키기

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

function solution(numbers, direction) {
    if(direction === 'right') {
        numbers.unshift(numbers.pop())
    } else {
        numbers.push(numbers.shift())
    }
    return numbers
}

direction이 'right'인지 확인합니다. 만약 direction이 'right'라면, 배열의 오른쪽으로 회전해야 합니다.

오른쪽으로 회전하기 위해 numbers 배열에서 마지막 요소를 제거하고(pop()) 해당 요소를 배열의 맨 앞에 추가(unshift())합니다. 이를 통해 배열이 오른쪽으로 한 칸씩 회전됩니다.

만약 direction이 'left'라면, 배열의 왼쪽으로 회전해야 합니다.

왼쪽으로 회전하기 위해 numbers 배열에서 첫 번째 요소를 제거하고(shift()) 해당 요소를 배열의 맨 뒤에 추가(push())합니다. 이를 통해 배열이 왼쪽으로 한 칸씩 회전됩니다.

마지막으로, 회전된 numbers 배열을 반환합니다.

예를 들어, 주어진 numbers가 [1, 2, 3, 4, 5]이고 direction이 'right'일 경우, 오른쪽으로 한 칸씩 회전합니다. 따라서 반환되는 결과는 [5, 1, 2, 3, 4]입니다.

반대로, numbers가 [1, 2, 3, 4, 5]이고 direction이 'left'일 경우, 왼쪽으로 한 칸씩 회전합니다. 따라서 반환되는 결과는 [2, 3, 4, 5, 1]입니다.