기초부터 시작하는 코딩/Programmers

Programmers 문제를 풀어봅시다. Day27

kebab00 2023. 6. 14. 21:42

728x90

1. 직사각형 넓이 구하기

- 2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 

- 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

function solution(dots) {
    let answer = 0
    const width = Math.max(...dots.map(a => a[0]))-Math.min(...dots.map(a => a[0]))
    const height = Math.max(...dots.map(a => a[1]))-Math.min(...dots.map(a => a[1]))
    answer = width*height
    return answer
}

dts 배열을 이용하여 직사각형의 너비와 높이를 계산합니다.

- 너비는 dots 배열에서 x 좌표의 최대값에서 x 좌표의 최소값을 값입니다.

- 이를 구하기 위해 dots 배열의 점의 x 좌표를 추출하여 배열로 만든 , Math.min() Math.max() 함수를 사용하여 최소값과 최대값을 구합니다.

- 마찬가지로, 높이는 dots 배열에서 y 좌표의 최대값에서 y 좌표의 최소값을 값입니다.

- 이를 구하기 위해 dots 배열의 점의 y 좌표를 추출하여 배열로 만든 , Math.min() Math.max() 함수를 사용하여 최소값과 최대값을 구합니다.

포인트 !

- dots.map(a => a[1])은 dots 배열에서 각 점의 y 좌표를 추출하여 새로운 배열로 매핑하는 과정입니다.

- map() 함수는 배열의 각 요소에 대해 주어진 함수를 호출한 결과로 새로운 배열을 생성합니다. 이때, 주어진 함수는 각 요소를 인자로 받아서 변환 과정을 수행합니다.

- dots.map(a => a[1])은 dots 배열의 각 요소 a를 인자로 받아 a[1] 값을 반환하는 익명 함수를 적용합니다. 여기서 a[1]은 각 점의 y 좌표를 의미합니다.

- 따라서, dots.map(a => a[1])은 dots 배열에서 모든 점의 y 좌표를 추출하여 새로운 배열을 생성하는 것입니다.

- 예를 들어, dots 배열이 [[0, 0], [3, 2], [1, 4]]라고 가정하면, dots.map(a => a[1]) 결과는 [0, 2, 4] 됩니다. 이는 dots 배열의 점의 y 좌표들로 이루어진 새로운 배열입니다.

2. 직사각형 넓이 구하기

- 머쓱이는 RPG게임을 하고 있습니다.

- 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다.

- 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다.

- 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다.

- 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

[0, 0] board 중앙에 위치합니다.

- 예를 들어 board 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 있습니다.

function solution(keyinput, board) {
  const limit_x = Math.floor(board[0] / 2);
  const limit_y = Math.floor(board[1] / 2);
  const start = [0, 0];

  const direction = {
    up: [0, 1],
    down: [0, -1],
    left: [-1, 0],
    right: [1, 0],
  };

  for (let i of keyinput) {
    const [dx, dy] = direction[i];
    if (Math.abs(start[0] + dx) > limit_x || Math.abs(start[1] + dy) > limit_y) {
      continue;
    } else {
      start[0] += dx;
      start[1] += dy;
    }
  }

  return start;
}

- board 배열의 가로 길이를 2로 나눈 몫을 limit_x 변수에 할당합니다.

- 세로 길이를 2로 나눈 몫을 limit_y 변수에 할당합니다.

- 이렇게 함으로써 start 배열의 x 좌표와 y 좌표가 -limit_x에서 limit_x 사이의 값, -limit_y에서 limit_y 사이의 값으로 제한됩니다.

- start 배열은 초기에 [0, 0]으로 설정됩니다. 이 배열은 최종 위치를 나타내기 위한 변수입니다.

- direction 객체는 각 이동 방향에 대한 상대적인 x 좌표와 y 좌표 변화량을 나타냅니다.

- 예를 들어, 'up' 이동은 [0, 1]로 표현됩니다.

- keyinput 배열을 순회하면서 각 이동 방향에 따라 start 배열을 업데이트합니다.

- i 변수는 keyinput 배열의 각 요소를 순차적으로 나타냅니다.

- 각 이동 방향에 대해 상대적인 x 좌표 변화량을 dx에, y 좌표 변화량을 dy에 할당합니다.

- Math.abs(start[0] + dx) > limit_x 또는 Math.abs(start[1] + dy) > limit_y 조건문을 사용하여 start 배열의 x 좌표 또는 y 좌표가 범위를 벗어나면 (limit_x 또는 limit_y보다 크거나 작으면) 해당 이동 방향을 무시하고 다음 이동으로 넘어갑니다.

- 위의 조건문을 통과하면, start 배열의 x 좌표와 y 좌표를 dx와 dy만큼 업데이트합니다.

- 마지막으로, 최종 위치인 start 배열을 반환합니다.

- 예를 들어, keyinput 배열이 ["up", "right", "down", "left"]이고, board 배열이 [6, 4] , 최종 start 배열은 [1, 0] 됩니다.

- 각 이동 방향에 따라 start 배열이 [0, 1], [1, 1], [1, 0], [0, 0]으로 변경되기 때문입니다.

3. 최댓값 만들기 (2)

- 정수 배열 numbers가 매개변수로 주어집니다. 

- numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

function solution(numbers) {
  let answer = 0;

  numbers.sort((a, b) => a - b);

  let a1 = numbers[0] * numbers[1];
  let a2 = numbers[numbers.length - 1] * numbers[numbers.length - 2];
  answer = (a1 < a2) ? a2 : a1;

  return answer;
}

- numbers 배열을 정렬합니다.

- JavaScript의 sort() 메서드를 사용하여 배열을 오름차순으로 정렬합니다.

- 정렬된 배열은 원본 배열을 변경하므로, numbers 배열이 정렬됩니다.

- 정렬된 배열에서 가장 작은 두 수의 곱을 a1 변수에 할당합니다.

- 이를 위해 numbers[0]과 numbers[1]을 곱하여 a1에 저장합니다.

- 정렬된 배열에서 가장 큰 두 수의 곱을 a2 변수에 할당합니다.

- 이를 위해 numbers[numbers.length - 1]과 numbers[numbers.length - 2]을 곱하여 a2에 저장합니다.

- a1과 a2 중 더 큰 값을 answer 변수에 할당합니다.

- 삼항 조건 연산자 (a1 < a2) ? a2 : a1를 사용하여 a1이 a2보다 작으면 a2를, 그렇지 않으면 a1을 선택하여 answer에 저장합니다.