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에 저장합니다.