코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (10)

천서리 2023. 5. 25. 21:43
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 10 조건문, 배열, 수학, 시뮬레이션

출처 : https://programmers.co.kr/

 

프로그래머스

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

programmers.co.kr


점의 위치 구하기

문제

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

  • x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
  • x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
  • x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
  • x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.

x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • dot의 길이 = 2
  • dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
  • -500 ≤ dot의 원소 ≤ 500
  • dot의 원소는 0이 아닙니다.

 

입출력 예

 

dot result
[2, 4] 1
[-7, 9] 2

입출력 예 설명

 

입출력 예 #1

  • dot이 [2, 4]로 x 좌표와 y 좌표 모두 양수이므로 제 1 사분면에 속합니다. 따라서 1을 return 합니다.

입출력 예 #2

  • dot이 [-7, 9]로 x 좌표가 음수, y 좌표가 양수이므로 제 2 사분면에 속합니다. 따라서 2를 return 합니다.

 

solution.js

function solution(dot) {
    var x = dot[0];
    var y = dot[1];
    
    if (x > 0 && y > 0) {
        return 1;
    } else if (x < 0 && y > 0) {
        return 2;
    } else if (x < 0 && y < 0) {
        return 3;
    } else {
        return 4;
    }
}
  1. if (x > 0 && y > 0):
    • x 좌표와 y 좌표가 모두 양수인 경우입니다.
    • 이 경우에는 return 1;이 실행되어 제 1 사분면을 나타내는 값인 1을 반환합니다.
  2. else if (x < 0 && y > 0):
    • x 좌표가 음수이고 y 좌표가 양수인 경우입니다.
    • 이 경우에는 return 2;가 실행되어 제 2 사분면을 나타내는 값인 2를 반환합니다.
  3. else if (x < 0 && y < 0):
    • x 좌표와 y 좌표가 모두 음수인 경우입니다.
    • 이 경우에는 return 3;이 실행되어 제 3 사분면을 나타내는 값인 3을 반환합니다.
  4. else:
    • 위의 모든 조건을 만족하지 않는 경우입니다. 따라서 x 좌표가 양수이고 y 좌표가 음수인 경우입니다.
    • 이 경우에는 return 4;가 실행되어 제 4 사분면을 나타내는 값인 4를 반환합니다.

 

2차원으로 만들기

문제

정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

 

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

 

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]

 

제한사항

  • num_list의 길이는 n의 배 수개입니다.
  • 0 ≤ num_list의 길이 ≤ 150
  • 2 ≤ n < num_list의 길이

 

입출력 예

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]
[100, 95, 2, 4, 5, 6, 18, 33, 948] 3 [[100, 95, 2], [4, 5, 6], [18, 33, 948]]

 

입출력 예 설명

 

입출력 예 #1

  • num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 2 * 4 배열로 변경한 [[1, 2], [3, 4], [5, 6], [7, 8]] 을 return합니다.

입출력 예 #2

  • num_list가 [100, 95, 2, 4, 5, 6, 18, 33, 948] 로 길이가 9이고 n이 3이므로 3 * 3 배열로 변경한 [[100, 95, 2], [4, 5, 6], [18, 33, 948]] 을 return합니다.

 

solution.js

function solution(num_list, n) {
    var answer = [];
    
    for (var i = 0; i < num_list.length; i += n) {
        var row = num_list.slice(i, i + n);
        answer.push(row);
    }
    
    return answer;
}
  1. 함수 내부에서는 answer라는 빈 배열을 선언합니다. 이 배열은 결과로 반환될 2차원 배열입니다.
  2. for 루프를 사용하여 num_list 배열을 반복하면서 n개씩 나누어 새로운 행을 생성합니다. 루프 변수 i는 0부터 시작하여 n만큼씩 증가합니다.
  3. 반복할 때마다 num_list 배열의 i부터 i + n까지의 범위를 slice 메서드를 사용하여 추출하여 row라는 새로운 배열로 만듭니다. 이렇게 생성된 row 배열은 answer 배열에 추가됩니다.
  4. 반복이 끝나면 answer 배열이 완성되고, 최종적으로 answer를 반환합니다.

공 던지기

문제

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

 

 

제한사항

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

 

입출력 예

 

numbers k result
[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번에게 공을 던집니다.

 

solution.js

function solution(numbers, k) {
    return numbers[(--k*2)%numbers.length];
}
  1. (--k * 2) % numbers.length 식은 주어진 배열에서 k번째 요소를 찾기 위한 계산을 수행합니다.
  2. 먼저, k를 1씩 감소시킵니다. 이는 0부터 시작하는 인덱스를 기준으로 하는 배열의 인덱스와 맞추기 위한 조치입니다. 예를 들어, k가 1일 경우 실제 인덱스는 0이어야 하므로 --k를 수행하여 k를 0으로 만듭니다.
  3. 다음으로, k에 2를 곱합니다. 이렇게 함으로써 numbers 배열에서 k번째 요소의 다음 요소를 찾을 수 있습니다. 예를 들어, k가 0일 경우 실제로는 0번째와 1번째 요소 사이에 있는 요소를 찾아야 합니다. k에 2를 곱하면 0 * 2 = 0이므로, 0번째 요소를 찾을 수 있습니다.
  4. 마지막으로, numbers.length로 나눈 나머지를 구합니다. 이는 배열의 범위를 벗어나는 경우를 처리하기 위한 조치입니다. 예를 들어, numbers.length가 5이고 k가 3일 경우, (3 * 2) % 5는 6 % 5 = 1이 됩니다. 따라서 1번째 요소를 반환합니다.

배열 회전시키기

문제

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

 

 

제한사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 "left" 와 "right" 둘 중 하나입니다.

 

입출력 예

numbers direction result
[1, 2, 3] "right" [3, 1, 2]
[4, 455, 6, 4, -1, 45, 6] "left" [455, 6, 4, -1, 45, 6, 4]

 

입출력 예 설명

 

입출력 예 #1

  • numbers 가 [1, 2, 3]이고 direction이 "right" 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.

입출력 예 #2

  • numbers 가 [4, 455, 6, 4, -1, 45, 6]이고 direction이 "left" 이므로 왼쪽으로 한 칸씩 회전시킨 [455, 6, 4, -1, 45, 6, 4]를 return합니다.

 

solution.js

function solution(numbers, direction) {
  var answer = [...numbers];

  if (direction === "left") {
    var first = answer.shift();
    answer.push(first); 
  } else if (direction === "right") {
    var last = answer.pop();
    answer.unshift(last);
  }

  return answer;
}

먼저, answer 변수에 numbers 배열을 복사하여 할당합니다. 배열의 복사는 [...numbers] 구문을 사용하여 이루어집니다. 이렇게 복사된 answer 배열은 원본 배열에 영향을 주지 않고 독립적으로 작업할 수 있습니다.

  1. if (direction === "left"):
    • direction이 "left"인 경우, 배열을 왼쪽으로 회전시킵니다.
    • answer.shift()를 사용하여 배열의 첫 번째 요소를 제거하고 반환합니다. 이 요소는 first 변수에 할당됩니다.
    • 그리고 answer.push(first)를 사용하여 first 요소를 배열의 끝에 추가합니다.
  2. else if (direction === "right"):
    • direction이 "right"인 경우, 배열을 오른쪽으로 회전시킵니다.
    • answer.pop()을 사용하여 배열의 마지막 요소를 제거하고 반환합니다. 이 요소는 last 변수에 할당됩니다.
    • 그리고 answer.unshift(last)를 사용하여 last 요소를 배열의 첫 번째에 추가합니다.

마지막으로, 변경된 answer 배열을 반환합니다.

반응형
Adventure Time - BMO